Java中的无符号右移

Den*_*gin 1 java bit-shift bitwise-operators

简单的问题:为什么如果我将Java中的无符号右移应用于字节变量(以及简短),它会将其威胁为int:

byte x = -1;
System.out.println(x >> 2);
System.out.println(x >>> 1);
System.out.println(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

控制台输出:

-1
2147483647
2147483647
Run Code Online (Sandbox Code Playgroud)

Njo*_*jol 5

只能在Java中使用int和long的移位运算符(就像所有其他数字运算符一样),因此在移位之前,字节会自动转换为int.这也发生在算术右移,但是-1 >> 2无论什么类型都是-1 -1,因为算术上向右移位的二进制表示111...111仍然是111...111,在逻辑上它变为011...111,即移位类型的最大值.

PS:算术移位是有符号移位,逻辑移位是无符号移位.