int转byte或short一定会发生精度丢失,因取值范围更小而强制截断高位:int→byte保留低8位(-128~127),int→short保留低16位(-32768~32767),需手动校验范围以防意外。

Java 中 int 转 byte 或 short 时,**一定会发生精度丢失(数据截断)**,因为它们的取值范围更小。这不是“可能丢失”,而是强制窄化转换(narrowing primitive conversion),JVM 直接丢弃高位字节。
int → byte:只保留低 8 位,范围压缩为 -128 ~ 127
byte 是 1 字节(8 位),有符号,补码表示,有效范围是 -128 到 127。将 int 强转为 byte 时,JVM 取该 int 值的二进制形式的**最低 8 位**,其余高位全部丢弃。
-
例如:
int i = 200;→ 二进制(32 位)为...0000000011001000,取低 8 位11001000,作为byte解释为补码 → 十进制是 -56 -
int j = -1;→ 二进制全为 1(11111111111111111111111111111111),取低 8 位仍是11111111→byte值为 -1(无变化) -
int k = 128;→ 低 8 位10000000→byte值为 -128
int → short:只保留低 16 位,范围压缩为 -32768 ~ 32767
short 是 2 字节(16 位),有符号,同样采用补码。转换时取 int 的低 16 位,高位舍弃。
-
int x = 40000;→ 十六进制为0x9C40,低 16 位就是它本身,但作为short解释:最高位为 1 → 负数 → 补码转原码得 -25536 -
int y = 32767;→short结果仍为 32767(未超限) -
int z = -32769;→ 二进制低 16 位为1000000000000000(即 0x8000)→short值为 -32768
如何安全转换?需显式检查范围
Java 不会在编译或运行时自动报错(除非用 Math.toIntExact() 等辅助方法)。要避免意外截断,应手动校验:
立即学习“Java免费学习笔记(深入)”;
- 转
byte前:用if (i >= Byte.MIN_VALUE && i - 转
short前:用if (i >= Short.MIN_VALUE && i - 或使用 JDK 8+ 的工具方法:
Byte.valueOf((byte) i)不防错;但Math.toIntExact(i)不适用,可封装:static byte toByteExact(int i) { if (i Byte.MAX_VALUE) throw new ArithmeticException("Overflow"); return (byte) i; }
注意:自动类型提升不会丢失,但显式强转才会
方法调用或赋值时若目标类型更小,Java 要求显式强转(否则编译失败),这正是语言在提醒你——你在主动放弃信息。比如:
-
byte b = 100;✅ 编译通过(字面量在范围内,编译器允许) -
int i = 100; byte b = i;❌ 编译错误:“incompatible types: possible lossy conversion” -
byte b = (byte) i;✅ 通过,但已明确承担截断风险










