你可以看一下位。使用二进制补码符号,位为-4
and -5
是,为简洁起见,仅显示最后 8 位:
-4: 1111 1100
-5: 1111 1011
位右移 2 位,带符号扩展:
-4 >> 2: 1111 1111 (-1)
-5 >> 2: 1111 1110 (-2)
通常情况下,你会想到>>>
不使用符号扩展,这是事实,但在这种情况下:
r >>>= 2;
... 价值r
被提升为int
对于使用二进制数字提升的位移操作,但复合赋值运算符将返回值转换回byte
,移入的零“消失”。
byte r = -5; // 1111 1100
r >>>= -2; // promoted to int: 11111111 11111111 11111111 11111010
// bit shift: 00111111 11111111 11111111 11111110
// cast back to byte: 11111110 (-2)
The JLS,第 15.26.2 节,讨论复合赋值运算符中完成的转换操作:
E1 op= E2 形式的复合赋值表达式等效于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,但 E1 仅计算一次。
也就是说,在这种情况下,位移的结果被投射回byte
.
当值的值相同时,会发生相同的转换回字节操作r
is -4
.
请注意,如果作业部分未完成,那么您将不会看到相同的答案,因为它不会将结果转换回byte
:
System.out.println(r >>> 2);
然后你会看到:
1073741822