我知道,在 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
s 或更大的值进行计算,所以
考虑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
java中最小的类型是int。部分原因是 CPU 现在可以处理整数或更大的类型。因此,JVM 是基于 int 实现的,并且只是为了方便而添加了其他较小的数据类型,如 byte、char、boolean。
因此,当您进行位操作时,您可以享受您提到的不一致。
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