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

Java中int值160强制转换为byte后输出-96的原因是什么

Java int 类型160强转byte输出-96的原理说明

首先给出测试代码:

int einInt;
byte einByte;

einInt = 160;
einByte = (byte) einInt;
System.out.println(einByte); // 输出结果为-96

1. 前提:Java整数的底层存储规则

  • 所有整数类型均为有符号数,最高位为符号位:0代表正数,1代表负数
  • int为32位有符号整数,取值范围是-2^31 ~ 2^31 - 1
  • byte为8位有符号整数,取值范围是-128(-2^7) ~ 127(2^7 - 1)
  • 所有整数在JVM中均以补码形式存储

2. 强转时的高位截断逻辑

把取值范围更大的int强制转换为byte属于窄化原始类型转换,Java不会做数值范围校验,会直接截断int的高24位,只保留低8位作为byte的存储值:

  1. 160对应的32位int补码为:00000000 00000000 00000000 10100000
  2. 强转截断后保留的8位byte值为:10100000

3. 补码转十进制的计算过程

我们拿到的10100000是byte的补码,需要转换为可读的十进制值,有两种计算方式:

方式一:原码转换法

  1. 看符号位:最高位为1,说明是负数
  2. 负数补码转原码规则:补码减1得到反码,反码除符号位外按位取反得到原码
  3. 计算步骤:
    • 补码:10100000
    • 补码减1得反码:10100000 - 1 = 10011111
    • 反码除符号位取反得原码:1 1100000
  4. 原码最高位为负号,剩余7位1100000转换为十进制是96,最终结果为-96

方式二:权重直接计算法

8位有符号数的最高位权重为-128,其余位从高到低权重依次为64、32、16、8、4、2、1,直接计算:
10100000 = 1*(-128) + 0*64 + 1*32 + 0*16 + 0*8 + 0*4 + 0*2 + 0*1 = -96

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:57:02