关键在于运算前预检而非事后补救;加法乘法需符号分治边界预检,禁止依赖a + b等事后判断。

核心计算过程要真正安全可控,关键不是等溢出发生后再补救,而是把捕获动作前置到运算发生前——让风险在结果生成前就被识别和拦截。
加法与乘法必须做符号分治的边界预检
不能依赖事后判断(比如a + b ),它对负溢出完全失效(两个大负数相加得正数),也扛不住混合符号场景。
- 加法检查:若 a > 0 且 b > 0,检查 a > Long.MAX_VALUE - b;若 a a
- 乘法检查更需分情况:正×正、负×负统一用绝对值后比较 b != 0 && |a| > Long.MAX_VALUE / |b|;正×负则检查是否低于最小值,即 a (注意整除截断,建议直接用 Math.multiplyExact)
优先启用语言级精确运算工具
Java 8+ 的 Math.addExact、Math.multiplyExact 等方法,底层调用 JVM 溢出检测指令,比手写逻辑更简洁、更可靠。
- 它们对 long 直接生效,无需类型转换或额外包装
- 溢出时明确抛出 ArithmeticException,强制你设计降级路径(如告警、切换 BigInteger、返回默认值)
- 不适用于浮点数,但在整型关键路径上应作为默认选择
警惕隐式截断与无符号误用
很多溢出被掩盖在类型转换中:比如 long 计算结果赋给 int、short,或从有符号转无符号时高位丢失。这类问题往往静默发生,日志里看不出异常。
- 审查所有跨类型赋值和参数传递,尤其是接口入参、数据库字段映射、序列化反序列化环节
- 对高频累加场景(如计费、统计),可结合阈值限流(如单次累加超 10^12 就拒绝)或直接升级为 BigInteger
- 在 ABAP 等系统中,可用 CATCH SYSTEM-EXCEPTIONS arithmetic_errors 捕获并统一处理,避免程序中断但数据错乱
浮点数需防指数上下溢与 NaN 连锁
Softmax、概率归一化、科学计算等场景中,exp(x) 在 x > 709 或 x
- 采用 LogSumExp 技巧:先平移输入(减去最大值),再计算 exp,避免原始值过大
- 对输入做范围约束(如 clip 到 [−50, 50]),或在训练中加入梯度裁剪
- Python 中用 try-except 捕获 OverflowError,而非靠 isinf/isnan 事后校验










