在Java中,为什么byte类型可以使用&0xff进行无符号右移操作?

3

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

因此,在Java中,我们将得到一个不正确的答案,用于byte类型的 >>> 操作。

例如:

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

D的答案等于C。但是E的答案是正确的。我想不出原因。

谢谢

3个回答

1
正如所说,Java总是使用int或更大的计算,因此
考虑b = 1111 0001(请注意,设置了最高位,因此b实际上为-15)
隐式转换为int:
(int)b = 1111 .... 1111 0001
右移:
(b>>4) = 1111 1111 .... 1111 1111
(b>>>4) = 0000 1111 .... 1111 1111
显式转换为bool:
c = d = 1111 1111。
考虑: e=(byte)((b&0xff)>>4); 隐式转换为int:
(int)b = 1111 .... .... 1111 0001 与0xff进行AND运算:
x&0xff = 0000 .... 0000 1111 0001 进行右移操作:
(b&0xff)>>4 = 0000 .... 0000 1111 显式转换为byte:
e = 0000 1111

0

你已经回答了自己的问题:“在进行右移操作之前,首先将其转换为int类型”,因此

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

首先

b -> int => 0xfffffff1 

然后

0xfffffff1 & 0xff => 0xf1 

那么

0xf1 >> 4 => 0xf

0
Java中最小的类型是int。这部分是因为现在的CPU都使用整数或更大的类型。因此,JVM是基于int实现的,其他较小的数据类型如byte、char和boolean只是为了方便而添加的。
因此,当您进行位操作时,您可能会遇到像您提到的不一致性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接