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

Java中Unsigned Right Shift与普通右移运算符结果一致的原因是什么?

问题原因
  • Java移位运算存在自动类型提升规则:byte、short类型的操作数在执行移位前,会先被提升为32位int类型。你定义的byte b1 = -99,提升为int后的二进制补码为11111111 11111111 11111111 10011101(你注释里标注的01100011是+99的二进制,byte类型-99的补码实际为10011101)。
  • 算术右移>>会在左侧补符号位(此处符号位为1),逻辑右移>>>会在左侧补0,但两者补的位都落在32位int的高24位区间。
  • 运算结束后你强制将结果转为byte类型,会直接丢弃高24位,只保留最后8位,因此两种移位操作得到的最终8位结果完全一致,输出均为-13。
解决方法

在移位前先将byte值转为无符号32位值,即通过和0xFF按位与清空高24位的符号位干扰,再执行逻辑右移:

byte b1 = -99;
// 先做无符号转换再移位
byte result = (byte) ((b1 & 0xFF) >>> 6);
String str = String.format("%8s", Integer.toBinaryString(result & 0xFF)).replace(' ', '0');
System.out.println("result: " + result); // 输出为2,符合逻辑右移预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:15:02