缩小从 int 到 unsigned char 的转换范围

Dar*_*_09 4 c++ int char narrowing

当我尝试编译这段代码时

struct T
{
    unsigned char x;
};

int main()
{
    unsigned char a = 10;
    unsigned char b = 1;

    T t = {a + b};

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

错误:在 { } [-Wnarrowing]| 内将 '(((int)a) + ((int)b))' 从 'int' 缩小转换为 'unsigned char'

谁能解释一下为什么?

Joh*_*eau 5

加法表达式的操作数正在进行积分提升

特别是,算术运算符不接受小于 int 的类型作为参数,并且在左值到右值转换后会自动应用整数提升(如果适用)。此转换始终保留该值。

您的ab被提升为intor unsigned int,添加,然后转换回unsigned char

如果转换是预期的程序行为(从您作为设计者的角度来看),您可以将其显式转换为您想要的类型。显式强制转换不是缩小转换。隐式强制转换是。因此,如果我们将隐式转换更改为显式转换,程序就不再是格式错误的。

T t = { static_cast<unsigned char>(a + b) };
Run Code Online (Sandbox Code Playgroud)

  • 如果您觉得可以接受,您可以[将错误设置为警告](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55783) 或者直接转换 `T t = { (unsigned char)( a + b) }; ` (2认同)