java中long赋值溢出实为int字面量或中间计算溢出所致,需加l后缀、用math.exact方法检查、防隐式截断,超限场景应改用biginteger。

Java 中 long 类型本身不会在赋值时“自动溢出”,但**字面量赋值错误或中间计算溢出**才是真问题——你看到的“long 赋值溢出”,其实是编译器把数字当成了 int 先算错了,再试图转成 long,结果早已失真。
字面量必须带 L 后缀
Java 默认整数字面量是 int 类型。哪怕你写 long a = 10000000000;,这个 10000000000 已超出 int 范围,编译直接报错。
- ✅ 正确:加
L(大小写均可,推荐大写)long a = 10000000000L; - ✅ 安全写法:让第一个操作数升级,避免整条表达式按 int 算
long b = 1000000000L * 2000 * 10; - ❌ 危险:没加 L,乘法先按 int 算,溢出后才转 long
long c = 1000000000 * 2000 * 10L; // 先算 1000000000*2000 → 溢出得 -1486618624,再 ×10L
运算前做溢出检查,别等结果出来再看
long 运算不报错,溢出后静默回绕(比如 Long.MAX_VALUE + 1L 变成 Long.MIN_VALUE),日志里看不出异常。必须在加、乘之前主动拦住。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 JDK 内置方法最省心:
Math.addExact(a, b)、Math.multiplyExact(a, b)
溢出直接抛ArithmeticException,强制你处理 - 手动检查加法(适合无法改异常策略的场景):
若a > 0 && b > 0 && a > Long.MAX_VALUE - b→ 正溢出
若a → 负溢出 - 乘法检查更复杂,优先用
Math.multiplyExact,避免自己漏掉符号组合
警惕类型隐式截断和上下文误用
很多“溢出感”其实不是计算溢出,而是类型精度在流转中被悄悄砍掉了。
- 数据库字段是
BIGINT,Java 用int接收 → 启动就截断,后续全错 - RPC 接口定义
long,但 JSON 序列化配置把大数转成int→ 高位丢失,静默失败 - 排序比较写
(int)(a - b)(a、b是long时间戳)→ 差值超Integer.MAX_VALUE就翻转,排序逻辑崩坏
该换 BigInteger 时别硬扛
不是所有大数都适合死守 long。以下情况建议直接切 BigInteger:
- 阶乘、幂运算、组合数等数学结果天然易超
long(如 21! 就溢出) - 用户输入不可控,且业务有明确上限(比如单日 PV 不会超 1000 亿),可用阈值预检 +
BigInteger降级 - 后台批处理、ID 生成、金融精度要求场景,
BigInteger的任意精度比“赌不溢出”更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










