Java中int类型固定占4字节,取值范围为−2,147,483,648至2,147,483,647,溢出时按模2³²绕回而非报错,需通过Math.addExact()等方法主动防御或升阶用long、BigInteger。

Java 中 int 类型固定占用 4 个字节(32 位),取值范围为 −2,147,483,648 到 2,147,483,647。溢出不是报错,而是数值“绕回”,比如加 1 超过最大值就变成最小值——这是由二进制补码机制决定的,必须在编码中主动识别和防御。
int 的内存与取值范围本质
int 是有符号 32 位整数:最高 1 位是符号位,剩下 31 位表示数值。因此理论范围是 −2³¹ 到 2³¹−1。Java 规范强制规定该布局,所有 JVM 实现都一致。
-
Integer.MAX_VALUE就是 2³¹−1 = 2,147,483,647 -
Integer.MIN_VALUE就是 −2³¹ = −2,147,483,648 - 超出任一端时,结果按模 2³² 运算:例如
MAX_VALUE + 1等价于(2³¹−1 + 1) mod 2³² = −2³¹,即MIN_VALUE
常见溢出发生场景
不是所有计算都会溢出,但以下几类操作风险极高:
- 循环计数器累加到接近
MAX_VALUE后继续递增 - 两个大正数相加,如
1_500_000_000 + 1_000_000_000 - 乘法运算,如
100_000 * 100_000(结果 10¹⁰ > MAX_VALUE) - 时间戳差值计算(如毫秒级时间差可能超 24.8 天)
- 数组索引或分页偏移量动态计算,未校验边界
三种实用防御策略
不能只靠“用 long 替代”——要结合场景选择合适方式:
立即学习“Java免费学习笔记(深入)”;
-
提前检查:对加/减/乘使用
Math.addExact()、Math.multiplyExact()等方法,溢出时抛ArithmeticException,比静默绕回更安全 -
升阶处理:若确定需更大范围且值不会极端大,改用
long(64 位,范围约 ±9.2×10¹⁸),注意字面量加L后缀,如10000000000L -
任意精度计算:金融、密码学等不允许任何误差的场景,用
BigInteger,它无固定上限,但带来对象开销和性能损耗
验证溢出行为的小实验
运行这段代码能直观看到绕回现象:
int max = Integer.MAX_VALUE; System.out.println(max); // 2147483647 System.out.println(max + 1); // -2147483648 System.out.println(max + 2); // -2147483647 System.out.println(Integer.toBinaryString(max + 1)); // 输出 10000000000000000000000000000000(32 位补码)
输出结果证实:溢出后高位符号位翻转,整个数值逻辑上“重置”到负数区起点。


















