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(有符号右移)
步骤如下:
- 类型提升:
byte b的值是-15,提升为int后,通过符号扩展得到32位补码:
这个32位int的值仍然是-15。11111111 11111111 11111111 11110001 - 执行有符号右移:
>>是有符号右移,规则是高位补符号位(这里符号位是1,所以补1)。右移1位后得到:11111111 11111111 11111111 11111000 - 转换为十进制:这是负数的补码,需要先取反加1得到原码:
- 取反:
00000000 00000000 00000000 00000111 - 加1:
00000000 00000000 00000000 00001000(对应十进制8)
所以这个补码对应的十进制是-8,也就是你看到的输出b=-8。
- 取反:
2. 计算c >>> 1(无符号右移)
步骤如下:
- 类型提升:和上面一样,
byte c的值是-15,提升为int后的32位补码还是:11111111 11111111 11111111 11110001 - 执行无符号右移:
>>>是无符号右移,规则是高位补0(不管原符号位)。右移1位后得到:01111111 11111111 11111111 11111000 - 转换为十进制:这是正数的二进制,直接计算其值:
这个数等于32位int的最大值(2147483647)减去7,结果是2147483640,也就是你看到的输出c=2147483640。
内容的提问来源于stack exchange,提问作者zaozaoer
相关产品推荐
相关产品推荐

