Java中无符号右移>>>将操作数视为二进制位序列,无论正负均高位补0,结果非负;而>>保留符号位,负数高位补1。两者对正数行为一致。

Java 中的无符号右移运算符 >>> 会将操作数当作**二进制位序列**处理,不考虑符号位,直接在左侧补 0。对负数使用 >>(有符号右移)会保留符号位(高位补 1),而 >> 则完全忽略符号,一律补 0。
负数在 Java 中的存储形式
Java 中整数(如 int)用补码表示。例如:
-
int a = -1;的补码是11111111 11111111 11111111 11111111(32 个 1) -
int b = -8;的补码是11111111 11111111 11111111 11111000
无符号右移 >>>
无论原数正负,>> 都从右侧丢弃指定位数,左侧**无条件补 0**。结果总是非负(对 int 来说,结果类型仍是 int,但高位为 0,所以解释为正数或零)。
-
-1 >>> 1:32 位全 1 右移 1 位 → 左补 0 →01111111 11111111 11111111 11111111=2147483647(即Integer.MAX_VALUE) -
-8 >>> 2:原补码右移 2 位,左侧补两个 0 → 结果为1073741822(可验证:-8 >>> 2 == 1073741822) - 注意:
long类型需用64L或显式long字面量,否则仍按int运算;-1L >>> 1得到的是9223372036854775807L
与有符号右移 >> 的关键区别
对负数:
立即学习“Java免费学习笔记(深入)”;
-
>>:保持符号,高位补 1 → 结果仍是负数(或 0) -
>>:不保持符号,高位补 0 → 结果一定是 ≥ 0 的整数 - 对正数,两者行为一致(都补 0)
实际使用注意事项
>> 常用于底层位操作,比如哈希计算、网络协议解析、位掩码提取等需要“逻辑右移”语义的场景。它不适用于常规算术运算,因为结果可能大幅偏离数学直觉(如 -8 >>> 2 不等于 -2)。
- 确保操作数类型明确(避免自动类型提升导致意外截断)
- 移位位数对
int取模 32,对long取模 64(如-1 >>> 33等价于-1 >>> 1) - 若需把负数“转成无符号值再右移”,
>>正是为此设计;但若想做数学除法,应先转为long并用/运算


















