java基本类型溢出不报错而静默截断:有符号整型按模2ⁿ回绕(如int 2147483647+1→-2147483648),char无符号截断(65536→0),强制转换仅丢高位((byte)200→-56),浮点数溢出得infinity/nan、精度不足致舍入误差。

Java中基本类型超出取值范围时,不会报错、不抛异常,而是发生静默截断——即高位二进制位被直接丢弃,只保留低位有效位,结果完全改变但程序照常运行。这是最易被忽视的隐形bug来源。
整数类型的“绕回”现象
所有有符号整型(byte、short、int、long)采用补码表示,溢出时按模 2n 回绕:
- int:最大值 2147483647(0x7FFFFFFF)加 1 → 变成 -2147483648(0x80000000)
- byte:127 + 1 → -128;-128 - 1 → 127
- short:32767 + 1 → -32768
char 类型的无符号截断
char 是 16 位无符号类型,范围固定为 0~65535:
- 赋值 char c = -1; 编译直接失败(-1 不在合法范围内)
- 赋值 char c = 65536; → 实际存入的是 0(65536 % 65536 = 0)
- 与 int 混合运算后强制转回 char,如 (char)(65537) → 得到 1
强制类型转换中的无声丢位
类型转换不校验范围,仅做二进制位截断:
- (byte)200 → 200 的二进制是 11001000,截低 8 位后符号位为 1 → 值为 -56
- (short)0x12345678 → 仅保留低 16 位 0x5678(即 22136)
- (int)3.9 → 向零截断得 3,不是四舍五入
浮点类型不“绕回”,但会失真或溢出
float 和 double 遵循 IEEE 754 标准,行为不同:
- 超出可表示范围(如 Float.MAX_VALUE * 2)→ 结果为 Infinity 或 -Infinity
- 精度不足时(如 0.1f + 0.2f)→ 得到 0.30000001,非截断,而是尾数舍入误差
- 计算结果无法用有限位表示(如 Math.sqrt(-1))→ 得 NaN
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











