我想我在this answer中发现了类似的东西,但在这种情况下,它们没有将表达式的结果赋给变量在我的例子中,我分配它,但是表达式的位移部分没有效果。

unsigned leftmost1 = ((~0)>>20);
printf("leftmost1 %u\n", leftmost1);

退换商品
leftmost1 4294967295

鉴于
unsigned leftmost1 = ~0;
leftmost1 = leftmost1 >> 20;
printf("leftmost1 %u\n", leftmost1);

给我
leftmost1 4095

我希望将逻辑分成两行不会有影响,为什么结果会不同?

最佳答案

在第一种情况下,您正在执行带符号的右移,因为~0会产生带符号的值有符号右移的确切行为是由实现定义的,但大多数平台(包括您的平台)都扩展了符号位,因此该移位对于您输入的“all one”是不操作的。
在第二种情况下,您正在执行无符号右移,因为leftmost1是一个unsigned值。所以你从左边移零。
如果您想在没有中间赋值的情况下执行无符号移位,可以执行以下操作:

(~0u) >> 20

其中,u后缀表示无符号文本。

08-17 00:22