2

在 gcc 中,向小于的整数类型添加或减去常量会int导致int.

#include <cstdint>
#include <cstdio>

int main()
{
    int8_t wat = 5;
    printf("%zd\n", sizeof(wat + 1));
    return 0;
}

给出 4。我在使用带有 . 的简单+=语句时注意到了这一点-Wconversion。设置了警告标志后,

#include <cstdint>

int main()
{
    int8_t wat = 5;
    wat += 5;
    return 0;
}

wat.cpp:7:6:警告:从“int”转换为“int8_t {aka signed char}”可能会改变其值 [-Wconversion]

有没有办法抑制这个警告?为什么会出现这种情况?铸造似乎没有奏效。

4

1 回答 1

1

根据 C++ 标准

10 许多期望算术或枚举类型的操作数的二元运算符会导致转换并以类似的方式产生结果类型。目的是产生一个通用类型,这也是 result 的类型。这种模式称为通常的算术转换,

通常的算术转换包括积分提升

1 一个除bool、char16_t、char32_t或wchar_t以外的整数类型的纯右值,其整数转换秩(4.13)小于int的秩,如果int可以表示源的所有值,则可以转换为int类型的纯右值类型; 否则,可以将源纯右值转换为 unsigned int 类型的纯右值。

所以在这个表达式中

wat += 5;

相当于

wat = wat + 5;

wat右边的赋值转换为type int,表达式的类型wat + 5为int。由于 type 的值范围int大于 type的值,int8_t编译器会发出警告。

警告消息还显示了如何抑制警告: [-Wconversion]

于 2014-04-26T23:18:11.280 回答