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

Java中负字节值的>>与>>>运算符计算过程详解

分步解析你的Java位移计算问题

没问题,我来一步步拆解这两个位移操作的计算过程——核心要搞清楚Java里**有符号右移(>>)和无符号右移(>>>)**的区别,还有byte类型在运算时自动提升为int的细节,这是关键。


基础铺垫:补码与类型提升

Java中所有整数运算都是以补码形式进行的,而且byte类型在参与运算(包括位移)时,会自动提升为int类型:

  • 如果byte的最高位是1(负数),提升时会用1填充int的高24位(符号扩展);
  • 如果是0(正数),则用0填充。

先明确a = -15的二进制存储:

  • 15的8位二进制:00001111
  • -15的8位补码:对15的二进制取反(11110000)后加1,得到11110001(这是byte a的实际存储值)

1. 计算b >> 1(有符号右移)

步骤如下:

  1. 类型提升:byte b的值是-15,提升为int后,通过符号扩展得到32位补码:
    11111111 11111111 11111111 11110001
    
    这个32位int的值仍然是-15。
  2. 执行有符号右移:>>是有符号右移,规则是高位补符号位(这里符号位是1,所以补1)。右移1位后得到:
    11111111 11111111 11111111 11111000
    
  3. 转换为十进制:这是负数的补码,需要先取反加1得到原码:
    • 取反:00000000 00000000 00000000 00000111
    • 加1:00000000 00000000 00000000 00001000(对应十进制8)
      所以这个补码对应的十进制是-8,也就是你看到的输出b=-8。

2. 计算c >>> 1(无符号右移)

步骤如下:

  1. 类型提升:和上面一样,byte c的值是-15,提升为int后的32位补码还是:
    11111111 11111111 11111111 11110001
    
  2. 执行无符号右移:>>>是无符号右移,规则是高位补0(不管原符号位)。右移1位后得到:
    01111111 11111111 11111111 11111000
    
  3. 转换为十进制:这是正数的二进制,直接计算其值:
    这个数等于32位int的最大值(2147483647)减去7,结果是2147483640,也就是你看到的输出c=2147483640。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:21