3

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

谢谢

4

3 回答 3

1

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

考虑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:
x&0xff = 0000 .... 0000 1111 0001

做正确的转变:
(b&0xff)>>4 = 0000 .... 0000 1111

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

于 2013-02-07T19:57:16.127 回答
0

java中最小的类型是int。部分原因是 CPU 现在可以处理整数或更大的类型。因此,JVM 是基于 int 实现的,并且只是为了方便而添加了其他较小的数据类型,如 byte、char、boolean。

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

于 2013-02-07T19:51:07.863 回答
0

You answered your question yourself "before doing a right shift operation, will convert into the int type firstly", so

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

firstly

b -> int => 0xfffffff1 

then

0xfffffff1 & 0xff => 0xf1 

then

0xf1 >> 4 => 0xf
于 2013-02-07T19:53:00.810 回答