6

以下代码:

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

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

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

这是为什么?

4

3 回答 3

8

因为标准是这样说的。二元运算符的操作数经过整数提升,其中任何小于 an 的 int都提升为int; 操作的结果也有类型int。如果原始值为 0x12,则结果将为0x120,并将其分配给 an unsigned char将导致值发生变化。(分配的值将是0x20。)警告从何而来。

编辑:

从标准(第 5.8 节移位运算符):“操作数应为整数或无范围枚举类型,并执行整数提升。结果的类型是提升的左操作数的类型。” 与其他二元运算符不同, 无需努力从两个运算符中找到公共类型:结果类型是左操作数的类型,句点。但是积分提升仍然会发生:unsigned char将提升为int(或unsigned int如果int大小为 1)。

于 2013-07-05T13:16:11.877 回答
1

因为该int值可能大于unsigned char.

想想什么时候(即result)会发生什么。将其向左移动四位将使其(或)。编译器如何能够将该值压缩回? 它不能,所以它只是将其截断为( )。换句话说,整数运算的值可以改变。2550xff40800xff0result2400xf0result << 4

于 2013-07-05T13:12:42.290 回答
0

所有算术和逻辑运算符都对其参数执行“积分提升”。积分提升将小于int(like unsigned char) 的类型转换为intor unsigned int。如果替换为 ,您将看到相同的<<内容+

哦,不需要括号。

于 2013-07-05T13:20:46.857 回答