为什么在Java中,将16右移32得到16而不是0?16>&燃气轮机;32=16为什么?

为什么在Java中,将16右移32得到16而不是0?16>&燃气轮机;32=16为什么?,java,Java,在java中使用右移运算符时,我遇到了一个看起来很奇怪的情况。当我右移16乘31时,结果是0,但是尝试右移16乘32时,它本身仍然是16。有人能解释一下吗?我快疯了 public class RightShiftTest { public static void main(String args[]) { int b = 16; System.out.println("Bit pattern for int " + b + " is "

在java中使用右移运算符时,我遇到了一个看起来很奇怪的情况。当我右移16乘31时,结果是0,但是尝试右移16乘32时,它本身仍然是16。有人能解释一下吗?我快疯了

public class RightShiftTest {

    public static void main(String args[])  {        
        int b = 16;
        System.out.println("Bit pattern for int " + b + " is " +Integer.toBinaryString(b));

        // As expected it is 0 
        System.out.println("After right-shifting " + b + " for 31 times the value is " + (b>>31) + " and bit pattern is " +Integer.toBinaryString(b>>31));

        // But why is it not 0 but 16
        System.out.println("After right-shifting " + b + " for 32 times the value is " + (b>>32) + " and bit pattern is " +Integer.toBinaryString(b>>32));
     }    
}

Output:
Bit pattern for int 16 is 10000
After right-shifting 16 for 31 times the value is 0 and bit pattern is 0
After right-shifting 16 for 32 times the value is 16 and bit pattern is 10000
美国

如果左侧操作数的提升类型为
int
则只有五个 右操作数的最低阶位用作移位 距离。就好像右侧操作数受到 位逻辑与运算符
(§15.22.1),掩码值
0x1f
0b11111
)。因此,实际使用的换档距离始终处于 范围从0到31,包括在内。

值32表示为

100000

最低的5位是
00000
所以
0
,移动了0位。

简单的谷歌搜索可以给你答案。问:“为什么语言X会像它那样做呢?”答:因为规范这么说。常识来了,所以我不想检查规范,它说:(16>>1)32次会得到与(16>>32)相同的结果就一次,这是个合理的问题。事实上,我认为这是一个很好的问题,也是非常有用的问答参考资料。在任何情况下,这都不是一个问题的复制品,这个问题只是问轮班操作员如何工作,而对相关问题的回答中没有一个能解释这种行为。然而,这里给出的答案很好地解释了这一点。回答很好!非常感谢。如果你的问题已经得到了回答,请不要发表评论来感谢回答者。一旦你有了至少15个代表,你也可以接受的答案和任何其他你认为有用的答案。