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



我知道,在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的Anser是正确的。我想不出原因。

谢谢

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

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

隐式强制转换为 int:
(int)b = 1111 .... 1111 0001

做正确的班次:

(b>>4) = 1111 1111 .... 1111 1111 (b>>>4) = 0000 1111 .... 1111 1111

显式转换为布尔值: c = d = 1111 1111 .


考虑e=(byte)((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

java 中最小的类型是 int。部分原因是 CPU 现在使用整数或更强大的类型。因此,JVM是基于int实现的,并且为了方便起见,添加了其他较小的数据类型,如字节,字符,布尔值。

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

您自己回答了您的问题"在进行右移操作之前,将首先转换为 int 类型",所以

byte e=(byte)((b&0xff)>>4);

首先

b -> int => 0xfffffff1 

然后

0xfffffff1 & 0xff => 0xf1 

然后

0xf1 >> 4 => 0xf

相关内容

  • 没有找到相关文章

最新更新