Java 有人能解释一下在下面的程序中位移位是如何发生的吗?

Java 有人能解释一下在下面的程序中位移位是如何发生的吗?,java,Java,公共班机{ public static void main(String[] args){ byte x = -7; System.out.println(x>>2); System.out.println(x>>>2); } }运算符“>>”右移保留符号,而“>>>”运算符右移不保留符号(零移位)。在Java中,不能对字节执行位移位,因此首先将其提升为int 二进制中的So-7(

公共班机{

      public static void main(String[] args){
          byte x = -7;
          System.out.println(x>>2);
          System.out.println(x>>>2);
      }

}

运算符“>>”右移保留符号,而“>>>”运算符右移不保留符号(零移位)。在Java中,不能对字节执行位移位,因此首先将其提升为int

二进制中的So-7(提升为int)是:

11111111111111111111111111111001
使用“>>”操作符向右移动2,我们可以得到:

11111111111111111111111111111110
十进制是-2。现在使用“>>>”操作符,我们得到:

00111111111111111111111111111110

十进制为1073741822。

>
是。与所有其他数字运算符一样,它们将对
int
long
值执行操作,因此
字节
在移位之前隐式转换为
int

您看到的二进制/十进制值是:

11111001//字节x=-7
11111111111111111 001//x作为整数
1111111111111111111111 0//x>>2
00111111111111110//x>>>2
-2//1111111111111111111十进制为0
1073741822//11111111111111111111十进制0

这只是基本的语言知识。看一看,如果你有问题,再多问一些。编译器说不是这样。“>>>”给我的是1073741822而不是62,因为在位移位操作中字节被升级为int。@Birendra oops您是对的。我把Java和C搞混了。我对运算符的操作是正确的,但在Java中,不能对一个字节进行位移位。数字将首先升级为整数。有符号的移位仍然应为-2。我会更新答案。