右移操作数类型

cal*_*fir 8 c bit-manipulation

我想知道 C/C++ 位移运算符的正确右侧操作数是什么。

在撰写本文时,内置算术类型均小于 256 位,因此单个字节就足够了。此外,x86 移位指令使用imm8. 总之,这表明右侧操作数应该是 an unsigned char,并且此处使用不同类型将需要类型转换。

这里有“最正确”的类型可以使用吗?我知道该标准对于位移位的其他方面出奇地宽松,所以也许这是另一个相同的情况?

dbu*_*ush 9

任何整数类型都可以用作按位移位的右操作数,只要该值至少为 0 并且小于左操作数的位长度。

C 标准第 6.5.7 p2 和 p3 节中有关按位移位运算符的说明对此进行了详细说明:

2每个操作数应为整数类型

3对每个操作数执行整数提升。结果的类型是提升后的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

因此,虽然 an 的范围unsigned char应该足以容纳任何有效值,但int无论如何都会将正确的操作数提升为。