java位移运算对移位次数自动取模:int按32取模(取低5位),long按64取模(取低6位),该操作在运行期由jvm执行,不报错也不忽略。

Java 位移运算对移位次数自动取模,不是报错或忽略,而是按类型位宽严格截断有效位数。
int 和 long 的取模基数不同
Java 规定:移位操作只使用右侧操作数的低位部分,其余高位被丢弃。
- int 类型(32 位):实际移位量 = num % 32,等价于取 num 的低 5 位
- long 类型(64 位):实际移位量 = num % 64,等价于取 num 的低 6 位
例如:5 对 int 来说,34 % 32 = 2,等效于 <code>5 ;<code>5L 对 long 来说,70 % 64 = 6,等效于 <code>5L 。
byte、short、char 会先提升为 int 再运算
这些小整型不直接参与位移,而是先隐式转成 int(32 位),所以也遵循 % 32 规则。
比如:byte b = 1; b 实际执行的是 <code>((int)b) → <code>1 = 8。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
负的移位数会被取模后变成正数
Java 不禁止负数作为右操作数,但会先对其取模再计算。由于模运算结果非负,最终移位量总在合法范围内。
-
10 >> -1→ -1 % 32 = 31(Java 中负数取模向零截断,-1 + 32 = 31)→ 等效于10 >> 31 -
10L >>> -2→ -2 % 64 = 62 → 等效于10L >>> 62
虽然语法允许,但负移位数易引发误解,实践中应避免。
取模发生在编译期还是运行期?
是运行期行为,由 JVM 直接处理。即使右操作数是变量、表达式或方法返回值,JVM 都会在执行位移指令前完成取模。
这意味着:int n = 100; x 不会报错,也不会卡住,而是安全地执行 <code>x (因为 100 % 32 = 4)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










