You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中两次32位无符号右移运算结果不同的原因是什么

Java无符号右移结果差异原因解析

核心原因:Java移位运算符的隐性位数规则

Java语言规范中明确规定了移位操作的位数处理逻辑:

  • 当左操作数是int类型(32位)时,实际生效的移位位数为 右操作数对32取模的结果,等价于右操作数和31做按位与运算,仅右操作数的低5位会生效,取值范围固定为0~31。
  • 当左操作数是long类型(64位)时,实际生效的移位位数为右操作数对64取模的结果。

逐行拆解代码执行过程

首先明确:Java中int类型的-1用补码表示的二进制为32位全1:11111111 11111111 11111111 11111111

变量i的计算过程

  1. 初始值i = -1(全1二进制)
  2. 执行i = i>>>31:无符号右移31位,高位统一补0,得到结果二进制为00000000 00000000 00000000 00000001,对应十进制值1
  3. 执行i = i>>>1:将十进制1无符号右移1位,得到结果00000000 00000000 00000000 00000000,对应十进制值0,因此i最终输出为0。

变量j的计算过程

  1. 初始值j = -1(全1二进制)
  2. 执行j = j>>>32:右操作数是32,对32取模结果为0,等价于j>>>0,也就是没有做任何移位操作,结果仍然是初始值-1,因此j最终输出为-1。

内容的提问来源于stack exchange,提问作者mp3001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:24:03