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'
谁能解释一下为什么?
加法表达式的操作数正在进行积分提升。
特别是,算术运算符不接受小于 int 的类型作为参数,并且在左值到右值转换后会自动应用整数提升(如果适用)。此转换始终保留该值。
您的a和b被提升为intor unsigned int,添加,然后转换回unsigned char。
如果转换是预期的程序行为(从您作为设计者的角度来看),您可以将其显式转换为您想要的类型。显式强制转换不是缩小转换。隐式强制转换是。因此,如果我们将隐式转换更改为显式转换,程序就不再是格式错误的。
T t = { static_cast<unsigned char>(a + b) };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8081 次 |
| 最近记录: |