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的计算过程
- 初始值
i = -1(全1二进制) - 执行
i = i>>>31:无符号右移31位,高位统一补0,得到结果二进制为00000000 00000000 00000000 00000001,对应十进制值1 - 执行
i = i>>>1:将十进制1无符号右移1位,得到结果00000000 00000000 00000000 00000000,对应十进制值0,因此i最终输出为0。
变量j的计算过程
- 初始值
j = -1(全1二进制) - 执行
j = j>>>32:右操作数是32,对32取模结果为0,等价于j>>>0,也就是没有做任何移位操作,结果仍然是初始值-1,因此j最终输出为-1。
内容的提问来源于stack exchange,提问作者mp3001
相关产品推荐
相关产品推荐

