java中无符号右移运算符>>>对负数右移时直接在左侧补0,不考虑符号位,将负数补码高位1覆盖为0,结果解释为大正整数,如-1>>>1得2147483647。

Java 中的无符号右移运算符 >>> 对负数执行右移时,**不考虑符号位,直接在左侧补 0**,这与带符号右移 >> 有本质区别。
负数在 Java 中的二进制表示
Java 中整数使用补码存储。例如 int a = -1,其 32 位补码全为 1(即 0xFFFFFFFF)。对它右移时,>> 会保持符号位(左侧补 1),而 >>> 忽略符号含义,一律左侧补 0。
>>> 的实际效果:把负数“转成大正数”
由于补 0,高位原本的 1 被覆盖,结果变成一个很大的正整数。常见例子:
-
-1 >>> 1→0x7FFFFFFF(即 2147483647) -
-1 >>> 2→0x3FFFFFFF(即 1073741823) -
-8 >>> 2:-8 的补码是0xFFFFFFF8,右移 2 位后变成0x3FFFFFFE(即 1073741822)
注意类型宽度和自动提升
>>> 操作遵循 Java 的类型提升规则:
- 对
byte、short、char操作时,先提升为int,再右移 - 所以
(byte)-1 >>> 1实际是0xFFFFFFFF >>> 1→0x7FFFFFFF,不是按 8 位算 - 若需按原始位宽处理,需手动屏蔽高位,如
(b & 0xFF) >>> n
和 >> 的关键对比
以 int x = -16(二进制:11111111 11111111 11111111 11110000)为例:
-
x >> 2→ 补 1 →11111111 11111111 11111111 11111100= -4 -
x >>> 2→ 补 0 →00111111 11111111 11111111 11111100= 1073741820
不复杂但容易忽略:它不是“把负数变正”,而是按位清零高位后解释为无符号整数值——Java 本身没有无符号整型,所以结果仍是 int,只是数值变大了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











