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

带括号的右移运算符运算结果差异问题咨询

Java两段byte位移代码结果差异原因

核心差异源于Java的整数默认类型规则和有符号算术位移的符号扩展机制,具体拆解如下:

  • Java中所有整数字面量默认是int类型(32位有符号整数)
  • 有符号右移运算符>>为算术右移,位移时高位补符号位(正数补0,负数补1)
  • byte等窄类型参与位移运算时,会先自动提升为int类型,自动做符号扩展

第一段代码:byte b = (byte) (0xff >> 1);

  1. 字面量0xff默认是int类型,二进制为00000000 00000000 00000000 11111111,最高位为0,属于正数
  2. 执行>>1算术右移时高位补0,运算结果为00000000 00000000 00000000 01111111(对应十进制127)
  3. 强转为byte时仅保留低8位,最终b的二进制值为01111111

第二段代码:byte b = (byte) 0xff; b >>= 1;

  1. 第一步将int类型的0xff强转为byte,截断低8位得到11111111,byte是有符号类型,最高位为1表示负数,对应十进制值为-1
  2. 执行b >>=1时,b先自动提升为int类型,符号扩展后对应的int二进制为11111111 11111111 11111111 11111111
  3. 算术右移1位时高位补1,运算结果仍为全1的int值
  4. 赋值回byte类型时截断低8位,最终b的二进制值为11111111

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:39:01