为什么这个按位右移似乎不起作用?

时间:2009-02-24 22:59:07

标签: c bit-manipulation bit-shift binary-operators not-operator

有人可以向我解释为什么面具根本没有向右移动吗?您可以使用任何代替1的结果,结果将是相同的。

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

4 个答案:

答案 0 :(得分:26)

这是一个类型问题。如果你把0转为无符号,那就没关系了:

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

根据评论编辑:或使用无符号文字符号,这更简洁。 :)

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

答案 1 :(得分:13)

Sign extension

正在发生的事情是~0是一个设置了所有位(-1)的int。现在你右转1;因为它是-1,所以符号扩展保持最高位设置,因此它保持签名(这不是你所期望的)。然后它就像你期望的那样转换为无符号。

答案 2 :(得分:4)

试试这个:

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

作业的RHS被视为已签名的数量,除非你施放它,这意味着你看到没有演员表的符号扩展。 (我还更改了你的print语句,以十六进制显示数字,这对我来说更容易解码。)

答案 3 :(得分:2)

~0是一串的。 >>运算符移位它们,并且在有符号值中,它将1移位到更高位的位。所以你可以改变你想要的一切,结果不会改变。