我知道,在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 的答案是正确的。我想不出原因。
谢谢
最佳答案
如前所述,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
显式转换为 boolean 值:
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 - java中为什么byte类型可以用&0xff做无符号右移操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14759634/