当我使用位移位时byte
,我注意到使用无符号右移时得到了奇怪的结果(>>>
). With 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
to int
在内部,但似乎不足以解释这种行为。
为什么 Java 中的字节位移位会有这样的表现?
发生这种情况正是因为byte
is promoted to int
在执行按位运算之前。int -128
表示为:
11111111 11111111 11111111 10000000
因此,右移到 7 或 8 位仍然留下第 7 位 1,所以结果是narrowed为负数byte
value.
比较:
System.out.println((byte) (b >>> 7)); // -1
System.out.println((byte) ((b & 0xFF) >>> 7)); // 1
By b & 0xFF
,所有最高位在移位之前都被清除,因此结果按预期产生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)