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。我会更新答案。