按位移位将无符号字符提升为 int

bitwise shift promotes unsigned char to int

本文关键字:int 无符号 字符      更新时间:2023-10-16

以下代码:

unsigned char result;
result = (result << 4 );
使用 gcc 版本 4.6.4

(Debian 4.6.4-2( 编译,带有 -Wconversion 标志的结果是警告

警告:从"int"转换为"无符号字符"可能会更改其值 [-Wconversion]

为什么?

因为标准是这么说的。 二元运算符的操作数进行整体提升,其中任何小于 int晋升为int;操作的结果有也键入int。 如果原始值是,比如说, 0x12,结果将是0x120的,并将其分配给 unsigned char将导致值发生变化。 (分配的值将为0x20 .( 警告从何而来。

编辑:

根据标准(§5.8 移位运算符(:"操作数应属于整型或无作用域枚举类型和整型进行促销。 结果的类型是提升左操作数。 与其他二元运算符不同,有无需努力从两个运算符中找到通用类型:结果类型是左操作数 Period。 但不可或缺促销仍然会发生:unsigned char将是提升为int unsigned int(如果int的大小为1(.

因为int值可能大于unsigned char所能容纳的。

想想当result 255时会发生什么(即 0xff (。将其向左移动四位将使其4080(或0xff0(。编译器如何能够将该值压缩回result?它不能,所以它只是将其截断为240(0xf0(。换句话说,整数运算result << 4的值可能会被更改。

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

哦,不需要括号。