以下代码:
unsigned char result;
result = (result << 4 );
使用 gcc 版本 4.6.4 (Debian 4.6.4-2) 编译,带有 -Wconversion 标志会导致警告
警告:从 'int' 转换为 'unsigned char' 可能会改变其值 [-Wconversion]
这是为什么?
因为标准是这样说的。二元运算符的操作数经过整数提升,其中任何小于 an 的
int
都提升为int
; 操作的结果也有类型int
。如果原始值为
0x12
,则结果将为0x120
,并将其分配给 an
unsigned char
将导致值发生变化。(分配的值将是0x20
。)警告从何而来。
编辑:
从标准(第 5.8 节移位运算符):“操作数应为整数或无范围枚举类型,并执行整数提升。结果的类型是提升的左操作数的类型。” 与其他二元运算符不同,
无需努力从两个运算符中找到公共类型:结果类型是左操作数的类型,句点。但是积分提升仍然会发生:unsigned char
将提升为int
(或unsigned int
如果int
大小为 1)。
因为该int
值可能大于unsigned char
.
想想什么时候(即result
)会发生什么。将其向左移动四位将使其(或)。编译器如何能够将该值压缩回? 它不能,所以它只是将其截断为( )。换句话说,整数运算的值可以改变。255
0xff
4080
0xff0
result
240
0xf0
result << 4
所有算术和逻辑运算符都对其参数执行“积分提升”。积分提升将小于int
(like unsigned char
) 的类型转换为int
or unsigned int
。如果替换为 ,您将看到相同的<<
内容+
。
哦,不需要括号。