C++ 为什么向整数中添加常量并不能将其升级为更大的类型?
在gcc中,对小于C++ 为什么向整数中添加常量并不能将其升级为更大的类型?,c++,integer,integer-promotion,C++,Integer,Integer Promotion,在gcc中,对小于int的整数类型加上或减去一个常数,会得到int #include <cstdint> #include <cstdio> int main() { int8_t wat = 5; printf("%zd\n", sizeof(wat + 1)); return 0; } 给予 wat.cpp:7:6:警告:从'int'转换为'int8_t{aka signed char}'可能会改变其值[-Wconversion] 有没有办
int
的整数类型加上或减去一个常数,会得到int
#include <cstdint>
#include <cstdio>
int main()
{
int8_t wat = 5;
printf("%zd\n", sizeof(wat + 1));
return 0;
}
给予
wat.cpp:7:6:警告:从'int'转换为'int8_t{aka signed char}'可能会改变其值[-Wconversion]
有没有办法抑制此警告?为什么会这样?铸造似乎没有办法。 < P>根据C++标准 10许多期望算术或算术运算的操作数的二进制运算符 枚举类型导致转换,并以类似的方式生成结果类型 对目的是产生一个通用类型,它也是 结果。这种模式称为通常的算术转换 通常的算术转换包括积分提升 1除bool、char16\u t、char32\u t或 其整数转换秩(4.13)小于 如果int可以表示所有值,则int可以转换为int类型的prvalue 源类型的值;否则,源pr值可以是 已转换为类型为unsigned int的prvalue 所以在这个表达式中
wat += 5;
这相当于
wat = wat + 5;
赋值右侧的wat
转换为类型int
,表达式wat+5
的类型为int。由于类型int
的值范围大于类型int8\t
的值范围,编译器发出警告
此外,警告消息还显示了如何抑制警告:[-Wconversion]在这种情况下,Clang不会发出警告…并非所有整数都是
int
s。该标准将其定义为一个整体提升。
wat = wat + 5;