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的存储值:
- 160对应的32位int补码为:
00000000 00000000 00000000 10100000 - 强转截断后保留的8位byte值为:
10100000
3. 补码转十进制的计算过程
我们拿到的10100000是byte的补码,需要转换为可读的十进制值,有两种计算方式:
方式一:原码转换法
- 看符号位:最高位为1,说明是负数
- 负数补码转原码规则:补码减1得到反码,反码除符号位外按位取反得到原码
- 计算步骤:
- 补码:
10100000 - 补码减1得反码:
10100000 - 1 = 10011111 - 反码除符号位取反得原码:
1 1100000
- 补码:
- 原码最高位为负号,剩余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
相关产品推荐
相关产品推荐

