当我尝试在变量声明/赋值中应用正确的位移时,我看到了奇怪的行为:
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
也没有被解释为有符号值。
答案 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);
结果:
答案 1 :(得分:0)
在unsigned int i = ~0;
中,~0
被视为有符号整数(编译器应该对此发出警告)。
请改为尝试:
unsigned int i = (unsigned int)~0 >> 1;