Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么向整数中添加常量并不能将其升级为更大的类型?_C++_Integer_Integer Promotion - Fatal编程技术网

C++ 为什么向整数中添加常量并不能将其升级为更大的类型?

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] 有没有办

在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]


有没有办法抑制此警告?为什么会这样?铸造似乎没有办法。

< 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;