我正在读取包含unsigned char
变量的.cpp文件,它尝试按位左移16位,因为unsigned char
由8位组成,左移16位将擦除所有位并填写八个0。
unsigned char byte=0xff; byte << 16;
答案 0 :(得分:16)
当你移动一个值时,
unsigned char x = ...;
int y = x << 16;
如果x
适合int
(大多数系统),则unsigned char
的类型会提升为int
,如果unsigned
适合unsigned char
}不适合int
(罕见的 1 )。只要您的int
为25位宽或更宽,就不会丢弃任何数据 2 。
请注意,这与16
类型为int
的事实完全无关。
/* All three are exactly equivalent */
x << 16;
x << 16u;
x << (unsigned char) 16;
来自n1516的来源:(C99草案):
§6.5.7第3段:按位移位运算符
对每个操作数执行整数提升。结果的类型是 升级的左操作数。
§6.3.1.1第2段:布尔,字符和整数
如果int可以表示原始类型的所有值(由宽度限制,对于a bit-field),将值转换为int;否则,它将转换为无符号 INT。这些被称为整数促销。
<强>脚注:强>
1 :已知某些DSP芯片以及某些Cray超级计算机具有sizeof(char) == sizeof(int)
。这简化了处理器的加载存储单元的设计,但代价是额外的内存消耗。
2 :如果你的左移提升为int
然后溢出int
,这是未定义的行为(恶魔可能会飞出你的鼻子)。相比之下,溢出unsigned
始终是明确定义的,因此位移通常应在unsigned
类型上完成。
答案 1 :(得分:1)
如果char
适合int
,则会将其提升为int
,结果将如您所愿。如果不是这种情况,则根据标准是未定义的行为,并且可能会发出编译警告。从标准:
The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand. If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.