理解3 >> 2和-3 >> 2的结果是Java

Ale*_*x M 0 java

当我运行代码时:

public class OperateDemo18{
public static void main(String args[]){
    int x = 3 ; // 00000000 00000000 00000000 00000011
    int y = -3 ;    // 11111111 11111111 11111111 11111101
    System.out.println(x>>2) ;    
    System.out.println(y>>2) ;    
   }
};
Run Code Online (Sandbox Code Playgroud)

我输出为:

x>>2 is 0
y>>2 is -1
Run Code Online (Sandbox Code Playgroud)

正如我的理解,因为int x = 3,x>>2等于(3/2)/2它是0.75,整数,x>>20.

但我不明白为什么int y = -3,y>>2-1.有人可以解释一下吗?

Mar*_*ler 7

据我所知,由于int x = 3,x >> 2等于(3/2)/ 2,即0.75,因此对于整数,x >> 2为0.

这并不完全正确; >>是一个bithift操作,没有别的.对正整数的影响是除以2的幂,是的.但是对于无符号整数,它不是:

您方便地提供了y == -3自己的二进制形式:

11111111 11111111 11111111 11111101
Run Code Online (Sandbox Code Playgroud)

让我们把它换成两个!

y   == 11111111 11111111 11111111 11111101
y>>2== xx111111 11111111 11111111 11111111
Run Code Online (Sandbox Code Playgroud)

现在,你填写什么x

Java,就像大多数合理的语言一样,符号扩展,即.它使用原始的最高(最左边)位:

y   == 11111111 11111111 11111111 11111101
y>>2== 11111111 11111111 11111111 11111111
Run Code Online (Sandbox Code Playgroud)

不难看出这是"最大"的负整数(记住,负整数表示为"两个补码"!),即-1.