有人可以向我解释为什么面具根本没有向右移动吗?您可以使用任何代替1的结果,结果将是相同的。
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
答案 0 :(得分:26)
这是一个类型问题。如果你把0转为无符号,那就没关系了:
unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);
根据评论编辑:或使用无符号文字符号,这更简洁。 :)
unsigned mask = ~0u >> 1;
printf("%u\n", mask);
答案 1 :(得分:13)
正在发生的事情是~0
是一个设置了所有位(-1
)的int。现在你右转1
;因为它是-1
,所以符号扩展保持最高位设置,因此它保持签名(这不是你所期望的)。然后它就像你期望的那样转换为无符号。
答案 2 :(得分:4)
试试这个:
unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);
作业的RHS被视为已签名的数量,除非你施放它,这意味着你看到没有演员表的符号扩展。 (我还更改了你的print语句,以十六进制显示数字,这对我来说更容易解码。)
答案 3 :(得分:2)
~0是一串的。 >>运算符移位它们,并且在有符号值中,它将1移位到更高位的位。所以你可以改变你想要的一切,结果不会改变。