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