int的最大值为2147483647,最小值为−2147483648,超出范围将发生静默回绕而非崩溃;应使用integer.max_value等内置常量,优先升阶运算、调用math.addexact()等溢出检查api,并在累计、金额、时间戳等场景直接改用long或biginteger。

int 的最大取值是 2,147,483,647(即 2³¹ − 1),最小值是 −2,147,483,648。超出这个范围不会直接导致程序崩溃,但会引发静默回绕——比如加 1 后变成负数,这种“看似运行正常却结果错误”的行为,才是真正危险的源头。
明确 int 的边界值
Java 和 C/C++ 中的 32 位有符号 int 都遵循同一标准:32 位二进制补码表示。关键常量应直接使用语言内置符号,避免硬编码:
- Java:用 Integer.MAX_VALUE 和 Integer.MIN_VALUE
- C/C++:包含
后用 INT_MAX、INT_MIN - 不要写 2147483647 这类数字——易错、难维护、无类型语义
溢出不报错,但逻辑会失效
Java 不抛异常,C 语言中是有定义行为(未定义行为);两者都不会中断执行,而是让数值“绕回来”。典型后果包括:
- 循环次数突然变负,导致无限循环或跳过
- 数组索引变为负数,触发 ArrayIndexOutOfBoundsException(Java)或越界读写(C)
- 金额计算翻转成负值,金融系统出现资损风险
- 时间戳、ID 生成器产出重复或非法值
三类实用预防手段
不是等出问题再修,而是在关键路径提前设防:
- 优先升阶运算:涉及乘法、累加、大常量参与的表达式,先把至少一个操作数转为 long,例如 (long)a * b,避免中间结果溢出后再转 long
- 用标准溢出检查 API:Java 8+ 提供 Math.addExact()、Math.multiplyExact() 等,溢出时主动抛 ArithmeticException,便于捕获和处理
- 对输入做范围预判:比如接收用户输入的“数量×单价”,先估算是否可能超 int 范围,超则拒绝或切到 BigInteger / long 处理
什么时候必须换类型
以下场景建议直接放弃 int:
- 数据库主键 ID 超过 20 亿(如 MySQL 的 AUTO_INCREMENT 已接近上限)
- 毫秒级时间戳参与运算(System.currentTimeMillis() 当前值已超 1.7×10¹²)
- 科学计数、统计聚合(如 PV/UV 总和、文件字节数)
- 任何涉及“累计”“总数”“金额”且业务规模持续增长的字段











