按位左移一个16的无符号字符是什么意思

leo*_*may 13 c c++ bit-manipulation

我正在读取一个包含unsigned char变量的.cpp文件,它尝试按位左移16位,因为a unsigned char由8位组成,左移16位将擦除所有位并用8位填充它.

unsigned char byte=0xff; byte << 16;

Die*_*Epp 16

当你移动一个值时,

unsigned char x = ...;
int y = x << 16;
Run Code Online (Sandbox Code Playgroud)

如果适合(大多数系统),或者如果不适合(罕见的1),x则提升类型.只要您的宽度为25位或更宽,就不会丢弃任何数据2.intunsigned charintunsignedunsigned charintint

请注意,这与16具有类型的事实完全无关int.

/* All three are exactly equivalent */
x << 16;
x << 16u;
x << (unsigned char) 16;
Run Code Online (Sandbox Code Playgroud)

资料来源:从1516年(C99草案):

§6.5.7第3段:按位移位运算符

对每个操作数执行整数提升.结果的类型是提升的左操作数的类型.

§6.3.1.1第2段:布尔,字符和整数

如果int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它将转换为unsigned int.这些被称为整数促销.

脚注:

1:已知一些DSP芯片以及某些Cray超级计算机具有sizeof(char) == sizeof(int).这简化了处理器的加载存储单元的设计,但代价是额外的内存消耗.

2:如果你的左移提升为int然后溢出int,这是未定义的行为(恶魔可能会飞出你的鼻子).相比之下,四溢的unsigned始终是明确的,所以位移位通常可在完成unsigned类型.