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

为何以下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:00:48