java整数溢出默认静默回绕,math.addexact等方法在溢出时抛arithmeticexception,仅支持int/long类型,性能损耗小且异常信息明确,是关键计数场景首选方案。

Java 基础数据类型有明确的位宽和取值边界,超出就会发生静默溢出——不报错、不中断,但结果完全错误。关键不是“会不会溢出”,而是“什么时候会、怎么提前发现、怎么安全处理”。
八种基本类型的精确边界值
每种类型用固定位数存储,按补码规则表示正负,因此边界对称但不对等(负数多一个):
-
byte:8位,范围 -128 ~ 127(
Byte.MIN_VALUE/Byte.MAX_VALUE) - short:16位,范围 -32768 ~ 32767
-
int:32位,范围 -2147483648 ~ 2147483647(即
Integer.MIN_VALUE和Integer.MAX_VALUE) - long:64位,范围 -9223372036854775808 ~ 9223372036854775807
- float:32位 IEEE 754,可表示约 ±3.4×10³⁸,但**精度仅约6–7位十进制有效数字**
- double:64位 IEEE 754,可表示约 ±1.7×10³⁰⁸,**精度约15–16位**,仍是近似值
-
char:16位无符号 Unicode,范围 0 ~ 65535(
'\u0000'到'\uffff') -
boolean:无固定位宽,仅
true/false,不参与数值运算
整型溢出的典型表现与原理
溢出不是异常,是二进制补码自然“绕回”。例如 int 达到最大值后加 1,最高位(符号位)翻转,直接变成最小值:
int x = Integer.MAX_VALUE; // 2147483647 System.out.println(x + 1); // 输出 -2147483648 System.out.println(x + 2); // 输出 -2147483647
同理,最小值减 1 会绕回最大值。循环乘法(如 x = x * 3 连续执行)极易在十几轮内触发溢出,结果突变为负数且不可预测。
实战中推荐的溢出防护策略
不能只靠“换 long”,而要分场景选择合适方式:
-
运算前预检:对加法,可用
Math.addExact(a, b)—— 溢出时抛ArithmeticException;类似还有multiplyExact、subtractExact -
升位计算 + 范围校验:先转
long运算,再判断是否仍在int范围内:long result = (long)a + b;<br> if (result Integer.MAX_VALUE) { /* 溢出处理 */ } -
业务层约束输入:比如用户输入数量,前端限制最大值为
Integer.MAX_VALUE / 2,后端再校验,避免组合运算溢出 -
慎用强制转换:
(int) 3000000000L会静默截断为负数,应优先用Math.toIntExact()显式捕获
浮点类型不解决整数精度问题
别用 double 存身份证号、订单ID 或货币金额——double 无法精确表示大多数十进制小数(如 0.1 + 0.2 != 0.3),且超过 2^53 后连整数都会丢失精度。大整数必须用 long 或 BigInteger;精确计算用 BigDecimal。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











