Java位移运算对移位数取模:int类型取低5位(等价于%32),byte/short/char先提升为int再按int规则处理。

Java 中位移运算超出类型位数范围时,并不会报错或溢出异常,而是自动对移位数取模——这是语言规范强制要求的行为,所有 JVM 都一致执行。
int 类型:移位数只取低 5 位(等价于 % 32)
因为 int 是 32 位,Java 规定右操作数仅使用其二进制的低 5 位,即 n & 0x1F,效果等同于 n % 32:
5 实际执行的是 <code>5 → <code>5-
1 >> 60等价于1 >> (60 % 32)→1 >> 28 x 就是 <code>x ,相当于没移位,结果仍是 <code>x
long 类型:移位数取低 6 位(等价于 % 64)
long 占 64 位,因此右操作数取低 6 位(n & 0x3F),等价于 n % 64:
1L → <code>129 & 0x3F = 1→ 实际为1L-
100L >>> 72→72 % 64 = 8→ 等效于100L >>> 8
byte/short/char 移位前先提升为 int
这些小整型不直接参与移位,而是先被隐式转成 int,再按 int 规则处理(即模 32):
立即学习“Java免费学习笔记(深入)”;
byte b = -1; b → 先转为 <code>(int)b == -1,再计算-1 → <code>-1- 不会按 byte 的 8 位去模,更不会截断或报错
注意:这是运行期语义,不是编译优化
哪怕写 x >> Integer.MAX_VALUE,JVM 也会在运行时算出 Integer.MAX_VALUE & 0x1F == 31,然后执行右移 31 位。这个过程不可跳过,也不受编译器是否“看出规律”影响。


















