10

有人可以向我解释为什么面具根本没有向右移动吗?你可以用任何东西代替那个 1 ,结果是一样的。

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

4 回答 4

26

这是类型问题。如果您将 0 转换为无符号,那就没问题了:

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

根据评论编辑:或使用更简洁的无符号文字表示法。:)

unsigned mask = ~0u >> 1;
printf("%u\n", mask);
于 2009-02-24T23:04:31.910 回答
13

标志扩展

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

于 2009-02-24T23:02:06.927 回答
4

试试这个:

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

除非您强制转换,否则分配的 RHS 将被视为有符号数量,这意味着您在没有强制转换的情况下看到符号扩展。(我还更改了您的打印语句以显示十六进制数字,这对我来说更容易解码。)

于 2009-02-24T23:05:05.187 回答
2

~0 是一个字符串。>> 运算符将它们移位,并在有符号值中将 1 移位到高位。所以你可以随心所欲地改变,结果不会改变。

于 2009-02-24T23:03:43.537 回答