当我在 上使用位移时byte
,我注意到在使用无符号右移 ( >>>
) 时我得到了奇怪的结果。使用int
时,右移(有符号:>>
和无符号>>>
:)都按预期运行:
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 中以字节的方式表现?