以下代码:
unsigned char result;
result = (result << 4 );
使用gcc版本4.6.4(Debian 4.6.4-2)编译,带-Wconversion标志会产生警告
警告:从'int'转换为'unsigned char'可能会改变其值[-Wconversion]
为什么?
答案 0 :(得分:7)
因为标准是这样说的。二元运算符的操作数
进行整体推广,其中任何小于一个
int
被提升为int
;操作的结果有
也输入int
。如果原始值是,比方说,
0x12
,结果为0x120
,并将其分配给
unsigned char
会导致价值发生变化。 (指定的
值将为0x20
。)警告。
编辑:
从标准(§5.8Shift操作符):“操作数应该
是整数或无范围的枚举类型和整数
促销活动。结果的类型是
提升左操作数。“与其他二元运算符不同,有
没有努力从两个运营商中找到一个共同类型:
结果类型是左操作数,句点的类型。但积分
促销 仍然会发生:unsigned char
将会发生
如果int
的大小为unsigned int
,则提升为int
(或{{1}}
1)。
答案 1 :(得分:1)
因为int
值可能大于unsigned char
中的值。
考虑result
为255
时会发生什么(即0xff
)。将其向左移四位将使其成为4080
(或0xff0
)。编译器如何能够将该值重新压缩回result
?它不能,所以它只是将其截断为240
(0xf0
)。换句话说,整数操作result << 4
的值可能会被更改。
答案 2 :(得分:0)
所有算术运算符和逻辑运算符都对其参数执行“整数提升”。积分促销会将小于int
(如unsigned char
)的类型转换为int
或unsigned int
。如果将<<
替换为+
,您会看到同样的事情。
哦,不需要括号。