我想我在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
后缀表示无符号文本。