按位移位将unsigned char提升为int

时间:2013-07-05 13:08:54

标签: c++ linux gcc

以下代码:

unsigned char result;
result = (result << 4 );

使用gcc版本4.6.4(Debian 4.6.4-2)编译,带-Wconversion标志会产生警告

警告:从'int'转换为'unsigned char'可能会改变其值[-Wconversion]

为什么?

3 个答案:

答案 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中的值。

考虑result255时会发生什么(即0xff)。将其向左移四位将使其成为4080(或0xff0)。编译器如何能够将该值重新压缩回result?它不能,所以它只是将其截断为2400xf0)。换句话说,整数操作result << 4的值可能会被更改。

答案 2 :(得分:0)

所有算术运算符和逻辑运算符都对其参数执行“整数提升”。积分促销会将小于int(如unsigned char)的类型转换为intunsigned int。如果将<<替换为+,您会看到同样的事情。

哦,不需要括号。