带括号的右移运算符运算结果差异问题咨询
Java两段byte位移代码结果差异原因
核心差异源于Java的整数默认类型规则和有符号算术位移的符号扩展机制,具体拆解如下:
- Java中所有整数字面量默认是
int类型(32位有符号整数) - 有符号右移运算符
>>为算术右移,位移时高位补符号位(正数补0,负数补1) - byte等窄类型参与位移运算时,会先自动提升为int类型,自动做符号扩展
第一段代码:byte b = (byte) (0xff >> 1);
- 字面量
0xff默认是int类型,二进制为00000000 00000000 00000000 11111111,最高位为0,属于正数 - 执行
>>1算术右移时高位补0,运算结果为00000000 00000000 00000000 01111111(对应十进制127) - 强转为
byte时仅保留低8位,最终b的二进制值为01111111
第二段代码:byte b = (byte) 0xff; b >>= 1;
- 第一步将int类型的
0xff强转为byte,截断低8位得到11111111,byte是有符号类型,最高位为1表示负数,对应十进制值为-1 - 执行
b >>=1时,b先自动提升为int类型,符号扩展后对应的int二进制为11111111 11111111 11111111 11111111 - 算术右移1位时高位补1,运算结果仍为全1的int值
- 赋值回byte类型时截断低8位,最终b的二进制值为
11111111
内容的提问来源于stack exchange,提问作者Dean
相关产品推荐
相关产品推荐

