下面的效果是什么?
unsigned int x = -1; x >>= 2;
我不太确定 x 设置为什么,因为它是一个负数并且类型是无符号的?
unsigned int x = -1;
设置x
为UINT_MAX
(第 6.3.1.3 节,第 2 点)¹。int
-1 转换为用于的unsigned int
初始化x
。该转换是通过将UINT_MAX +1
值添加(或减去,但不是在这里)来完成的,直到它在 range0 .. UINT_MAX
中,一次在这里。
因此x >>= 2;
设置x
为UINT_MAX/4
,因为在第 6.5.7 节第 5 点中指定了无符号整数的按位右移:
结果
E1 >> E2
是E1
右移的E2
位位置。如果E1
具有无符号类型或E1
具有带符号类型和非负值,则结果的值是 E1 / 2 E2商的整数部分。
¹ “否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。”
-1 应该将 unsigned int 设置为 0xffffffff,这是该类型的最高数字(大约 48 亿)——如果 int 超过 32 位,则更高。
它是由有符号负值初始化的无符号类型。移位仍然在无符号值上执行。