2009-02-24 103 views

回答

25

这是一个类型问题。如果你投0到无符号,它会被罚款:每评论

unsigned mask = ~ (unsigned) 0 >> 1; 
printf("%u\n", mask); 

编辑:或使用无符号的文字符号,这是更为简洁。 :)

unsigned mask = ~0u >> 1; 
printf("%u\n", mask); 
+2

或者只是:“unsigned mask =〜0u >> 1;” u后缀表示一个无符号整数。 – Skizz 2009-02-24 23:09:49

13

Sign extension

发生了什么事是~0是(-1)将所有的位的int。现在你右移1;因为它是-1,符号扩展保持最高位设置,所以它仍然保持签名(这不是你期望的)。然后它会像您期望的那样转换为无符号。

2

〜0是一串。 >>运算符对它们进行移位,并在一个有符号的值中将其移入高位。所以你可以换所有你想要的,结果不会改变。

4

试试这个:

unsigned mask = (unsigned) ~0 >> 1; 
printf("%08x\n", mask); 

转让的RHS被当作一个符号量,除非你施放它,这意味着你没有看到剧组符号扩展。 (我也改变了你的打印语句,以十六进制显示数字,这对我来说更容易解码。)