为何以下Java代码运行结果为248而非-8?
Java byte变量左移操作结果异常的原因分析
先看你给出的代码:
public class Test{ public static void main(String[] args) { byte i = 31; System.out.println(i<<3); } }
你疑惑的点是:byte类型的i=31左移3位后,输出是248而不是预期的-8,对吧?
核心原因:Java的整数提升机制
在Java中,byte、short、char这三种窄整数类型参与任何算术运算(包括移位操作)时,都会先被自动提升为int类型,再执行运算。具体到你的代码,步骤是这样的:
- 第一步:byte类型的
31二进制是00011111(8位)。 - 第二步:执行
i << 3时,i被自动提升为32位的int类型,二进制变成00000000 00000000 00000000 00011111。 - 第三步:左移3位后,得到
00000000 00000000 00000000 11111000,这个32位int对应的十进制就是248,所以System.out.println输出的是这个int值。
为什么你会觉得应该是-8?
如果忽略整数提升,直接把8位byte的00011111左移3位,会得到11111000——这是byte类型的补码,对应的十进制确实是-8。但Java在运算时已经把byte提升为int了,所以结果是int类型的正数248,而非byte类型的负数-8。
验证:强制转换回byte
如果想得到-8的结果,只需要把运算结果强制转换回byte类型:
public class Test{ public static void main(String[] args) { byte i = 31; System.out.println((byte)(i<<3)); // 输出-8 } }
这时候,int类型的248被强制转换为byte,会截断高24位,剩下的8位11111000就是byte类型的-8。
内容的提问来源于stack exchange,提问作者 Bean Jelly
相关产品推荐
相关产品推荐

