0

下面的效果是什么?

unsigned int x = -1; x >>= 2;

我不太确定 x 设置为什么,因为它是一个负数并且类型是无符号的?

4

3 回答 3

3
unsigned int x = -1;

设置xUINT_MAX(第 6.3.1.3 节,第 2 点)¹。int-1 转换为用于的unsigned int初始化x。该转换是通过将UINT_MAX +1值添加(或减去,但不是在这里)来完成的,直到它在 range0 .. UINT_MAX中,一次在这里。

因此x >>= 2;设置xUINT_MAX/4,因为在第 6.5.7 节第 5 点中指定了无符号整数的按位右移:

结果E1 >> E2E1右移的E2位位置。如果E1具有无符号类型或E1具有带符号类型和非负值,则结果的值是 E1 / 2 E2商的整数部分。

¹ “否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。”

于 2012-05-02T10:55:13.963 回答
1

-1 应该将 unsigned int 设置为 0xffffffff,这是该类型的最高数字(大约 48 亿)——如果 int 超过 32 位,则更高。

于 2012-05-02T10:56:02.707 回答
1

它是由有符号负值初始化的无符号类型。移位仍然在无符号值上执行。

于 2012-05-02T10:57:15.180 回答