当我在 byte
上使用位移位时,我注意到在使用无符号右移 (>>>
) 时我得到了奇怪的结果。使用 int
,右移(signed:>>>
和 unsigned:>>>
)的行为都符合预期:
int min1 = Integer.MIN_VALUE>>31; //min1 = -1
int min2 = Integer.MIN_VALUE>>>31; //min2 = 1
但是当我对 byte
做同样的事情时,无符号右移会发生奇怪的事情:
byte b1 = Byte.MIN_VALUE; //b1 = -128
b1 >>= 7; //b1 = -1
byte b2 = Byte.MIN_VALUE; //b2 = -128
b2 >>>= 7; //b2 = -1; NOT 1!
b2 >>>= 8; //b2 = -1; NOT 0!
我认为可能是编译器在内部将 byte
转换为 int
,但似乎不足以解释该行为。
为什么 Java 中的字节移位会以这种方式运行?
最佳答案
这正是因为 byte
是 promoted到 int
之前执行按位运算。 int -128
表示为:
11111111 11111111 11111111 10000000
因此,右移 7 或 8 位仍然保留第 7 位 1,因此结果为 narrowed为负 byte
值。
比较:
System.out.println((byte) (b >>> 7)); // -1
System.out.println((byte) ((b & 0xFF) >>> 7)); // 1
通过 b & 0xFF
,所有最高位在移位之前被清除,因此结果如预期的那样产生。
关于java - Java中字节移位的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36454932/