在java中,为什么字节类型可以使用&;0xff执行无符号右移操作?

在java中,为什么字节类型可以使用&;0xff执行无符号右移操作?,java,byte,Java,Byte,我知道,在Java中,字节类型在进行右移操作之前,首先会转换为int类型 因此,在Java中,我们将得到字节类型>>>操作的错误答案 比如说, byte b=(byte)0xf1; byte c=(byte)(b>>4); byte d=(byte)(b>>>4); byte e=(byte)((b&0xff)>>4); d的答案等于c。但e的答案是正确的。我想不出原因 谢谢java中最小的类型是int。这部分是因为现在CPU使用整数或更大的类

我知道,在Java中,字节类型在进行右移操作之前,首先会转换为int类型

因此,在Java中,我们将得到字节类型>>>操作的错误答案

比如说,

byte b=(byte)0xf1;
byte c=(byte)(b>>4);
byte d=(byte)(b>>>4);
byte e=(byte)((b&0xff)>>4);
d的答案等于c。但e的答案是正确的。我想不出原因


谢谢

java中最小的类型是int。这部分是因为现在CPU使用整数或更大的类型。 结果,JVM是基于int实现的,其他较小的数据类型(如byte、char、boolean)只是为了方便而添加的


因此,当您执行位操作时,您可以享受您提到的不一致性。

您自己回答了问题“在执行右移操作之前,将首先转换为int类型”,因此

首先

b -> int => 0xfffffff1 
然后

然后


如前所述,Java总是使用
int
s或更大的值进行计算,所以

考虑
b=1111 0001
(注意设置了顶部位,因此
b
实际上是-15)

隐式转换为int:
(int)b=1111。。。。1111 0001

右移:
(b>>4)=1111111。。。。1111111

(b>>>4)=0000 1111。。。。1111111

显式强制转换为布尔值:
c=d=1111111


考虑
e=(字节)((b&0xff)>>4)

隐式转换为int:
(int)b=1111。。。。1111 0001

并且使用0xff:
x&0xff=0000。。。。0000 1111 0001

右移:
(b&0xff)>>4=0000。。。。0000 1111

显式转换为字节:
e=0000 1111

b -> int => 0xfffffff1 
0xfffffff1 & 0xff => 0xf1 
0xf1 >> 4 => 0xf