位移不适用于变量声明赋值单行

时间:2016-01-19 04:07:32

标签: c bit-manipulation bitwise-operators

当我尝试在变量声明/赋值中应用正确的位移时,我看到了奇怪的行为:

unsigned int i = ~0 >> 1;

我得到的结果是0xffffffff,好像>> 1根本就不存在。它似乎与~0有关,因为如果我改为:

unsigned int i = 0xffffffff >> 1;

我按预期得到0x7fffffff。我以为我可能会因操作符优先级问题而绊倒,所以尝试了:

unsigned int i = (~0) >> 1;

但它没有任何区别。我可以在单独的声明中执行转换,例如

unsigned int i = ~0;
i >>= 1;

但我想知道发生了什么。

更新感谢merlin2011指出我的答案。事实证明它正在执行算术转换,因为它将~0解释为带符号(负)值。最简单的修复似乎是:

unsigned int i = ~0u >> 1;

现在我想知道为什么0xffffffff也没有被解释为有符号值。

2 个答案:

答案 0 :(得分:1)

c编译器如何为有符号值工作。 C中数字的基数是int(在32位机器中,它是32位有符号int

您可能希望将其更改为:

unsigned int i = ~(unsigned int)0 >> 1;

原因是因为对于有符号的值,编译器会将运算符>>视为算术移位(或signed shift)。

或者,不久之后(M.M指出),

unsigned int i = ~0u >> 1;

测试:

printf("%x", i);

结果:

enter image description here

答案 1 :(得分:0)

unsigned int i = ~0;中,~0被视为有符号整数(编译器应该对此发出警告)。

请改为尝试:

unsigned int i = (unsigned int)~0 >> 1;