java基本类型取值范围及溢出规则:byte(-128~127)、short(-32768~32767)、int(-2147483648~2147483647)、long(-9223372036854775808~9223372036854775807)、char(0~65535),整型溢出静默绕回,推荐用math.exact系列防护。

Java基础类型取值范围速查
Java八种基本类型中,整数类型采用二进制补码表示,有固定上下界,超出即静默溢出(不抛异常、无提示):
- byte:-128 ~ 127(1字节)
- short:-32768 ~ 32767(2字节)
- int:-2147483648 ~ 2147483647(4字节)
- long:-9223372036854775808 ~ 9223372036854775807(8字节)
- char:0 ~ 65535(无符号16位)
- float/double:遵循IEEE 754,存在精度丢失,但不会“绕回”,而是产生±Infinity或NaN
- boolean:仅true/false,无数值溢出概念
整型溢出典型场景与现象
溢出发生在运算结果超出目标类型的可表示范围时。Java默认截断高位,导致符号位翻转或数值“绕圈”:
- int最大值+1 → 变成int最小值(2147483647 + 1 = -2147483648)
- int最小值-1 → 变成int最大值(-2147483648 - 1 = 2147483647)
- 乘法更危险:100000 * 100000 在int中得 -727379968(而非100亿)
- 隐式类型提升陷阱:int × int 运算仍为int结果,即使右侧用long声明,如
int a = 1000000000; long b = a * a;——乘法已在int内完成并溢出
四类实用溢出防护策略
根据性能、精度、代码可读性需求,选择合适手段:
-
使用Math.exact系列方法(推荐日常开发):Java 8+ 提供
Math.addExact、Math.multiplyExact等,溢出时明确抛ArithmeticException,便于快速定位和兜底处理 -
升阶计算+边界校验(适合性能敏感场景):先转为更大类型(如int→long)运算,再判断结果是否仍在原类型范围内,例如:
long temp = (long)a + b; if (temp > Integer.MAX_VALUE || temp - 改用BigInteger(高精度必选):适用于金融计算、大数算法、ID生成等不容错场景;支持任意长度整数,但对象开销大、语法略冗长
- 前置范围约束(防御式设计):对用户输入、配置参数、循环变量等,在进入计算前做合理上限检查,比如限制翻转整数的绝对值≤214748364(避免×10后必然溢出)
实战避坑要点
几个容易忽略却高频出错的细节:
- 数组索引用int,超21亿元素会溢出——考虑分片或改用long索引容器(需自行封装)
- 时间戳计算:
System.currentTimeMillis() + TimeUnit.DAYS.toMillis(365)中,toMillis返回long,但若左侧是int常量则先溢出 - 循环计数器慎用int:高并发/长时间运行服务中,累加亿次后可能绕回负数,引发逻辑崩溃
- 数据库映射注意:JDBC将BIGINT映射为long,若字段实际存超long范围值(如某些分布式ID),需用BigInteger或字符串接收
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











