C中负数的按位运算

时间:2012-05-02 10:51:59

标签: c bit-shift

以下是什么影响?

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

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

3 个答案:

答案 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;范围内,此处为此。

因此xUINT_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)

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