在java中,为什么字节类型可以使用&;0xff执行无符号右移操作?
我知道,在Java中,字节类型在进行右移操作之前,首先会转换为int类型 因此,在Java中,我们将得到字节类型>>>操作的错误答案 比如说,在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使用整数或更大的类
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