3

当我尝试编译这段代码时

struct T
{
    unsigned char x;
};

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

    T t = {a + b};

    return 0;
}

我收到此错误:

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

谁能解释我为什么?

4

1 回答 1

3

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

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

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

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

T t = { static_cast<unsigned char>(a + b) };
于 2020-03-07T18:07:26.790 回答