Java中显式转换时short类型128为何等于byte类型-128?
理解Short转Byte时的数值变化
嘿,这个问题核心在于Java里有符号整数的补码存储机制,咱们一步步拆解清楚:
首先得明确两个关键点:
- Java里的
byte是8位有符号整数,用补码表示,取值范围是-128 ~ 127 - 当把
short(16位有符号整数)强转为byte时,Java会直接截断高位的8位,只保留低8位的二进制位,然后把这8位当作有符号byte来解析
例子1:short的128转byte变成-128
- 先把short类型的128转成16位二进制:
00000000 10000000 - 强转byte时,只保留低8位:
10000000 - 对于8位有符号数来说,最高位是符号位(1代表负数),而
10000000是补码的特殊值,直接对应-128(这是补码体系里规定的,用来表示最小的负数)
例子2:short的1000转byte变成-24
- 先计算short类型1000的16位二进制:
00000011 11101000(计算过程:1000 = 512+256+128+64+32+8) - 强转byte时保留低8位:
11101000 - 这是一个负数的补码,咱们把它转成原码:
- 先对补码减1:
11101000 - 1 = 11100111 - 再对除符号位外的部分取反:
00011000,这个二进制对应的十进制是24 - 所以最终的byte值就是
-24
- 先对补码减1:
补充:强转的通用规则
所有整数类型之间的强转(比如int→short、long→byte)都是类似逻辑:截断高位,保留目标类型位数的二进制位,然后按有符号数解析。如果保留的二进制位最高位是1,结果就是负数,这就是为什么超出byte范围的正数转byte后会变成负数。
你的测试代码可以很好地验证这个逻辑:
import java.util.Scanner; public class ShortToByte{ public static void main (String args[]){ int i=0; while (i<6){ Scanner sinput = new Scanner (System.in); short a = sinput.nextShort(); byte b = (byte) a; System.out.println("Short value : " + a + ",Byte value : " + b); i++; } } }
内容的提问来源于stack exchange,提问作者noogler
相关产品推荐
相关产品推荐

