我知道,在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