news 2026/6/14 18:28:31

整数溢出陷阱:用除法安全比较乘积

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
整数溢出陷阱:用除法安全比较乘积

整数溢出陷阱:用除法安全比较乘积

在金融、电商、游戏等涉及大数值的业务中,经常出现类似判断:

if(balance>=unitPrice*quantity){// 余额足够支付}

unitPrice * quantity超出整型上限时,计算结果发生环绕,条件失效。尤其在 32 位环境下(int32_t上限约 21 亿),9 亿单价乘以 1 万数量,乘积 9 万亿远超上限,直接溢出为负数或小正数,导致错误放行或误拒。

本文给出一种零成本、完全等价的防御写法。


1. 溢出问题演示

假设使用int64_t存储金额(单位为分),手上余额balance = 9000 0000 0000(900亿分),需判断能否支付单价unitPrice = 9 0000 0000(9亿分)的 1 万件商品。

乘法表达式:

9 0000 0000 * 10000 = 9 0000 0000 0000 (9万亿)

int64_t最大值约 922 亿亿,看似不会溢出,但若使用int32_tuint32_t则会直接溢出。即便使用 64 位,若单价和数量进一步放大,依然会溢出。核心问题是:无法预知乘积是否越界


2. 解决方案:除法比较

将原条件balance >= unitPrice * quantity等价转换为:

balance / quantity >= unitPrice

前提:quantity > 0。这是业务上的自然约束(数量不能为 0 或负)。

转换后,除法运算的上限是balance,不会超出整型范围,彻底规避乘法溢出。


3. 等价性证明

balance = q * quantity + r,其中0 ≤ r < quantity,则balance / quantity = q

原条件:

balance >= unitPrice * quantity ⇔ q * quantity + r >= unitPrice * quantity ⇔ q + r/quantity >= unitPrice

由于r/quantity < 1,且unitPrice为整数,因此q + r/quantity >= unitPrice等价于q >= unitPrice。即:

balance / quantity >= unitPrice

整除截断不会造成误判,比较结果严格等价


4. 决策流程

在实际编码中,可以先用乘法安全阈值判断是否走除法分支,以获得最佳性能:

判断 balance >= unitPrice * quantity

quantity == 0?

处理 quantity 为 0 的边界

unitPrice > MAX / quantity?

直接比较 balance >= unitPrice * quantity

除法比较 balance / quantity >= unitPrice

返回结果

其中MAX为当前整型的最大值。若unitPrice > MAX / quantity,乘积必溢出,走除法路径;否则乘法安全。


5. 注意事项

  • quantity 必须为正整数。如果业务中可能出现 0 或负值,提前做参数校验。
  • 整除不会影响正确性。比较运算不关心余数,截断后的商已经足以判定。
  • 无需引入高精度或浮点库。原地使用原有整型,指令开销与乘法几乎无差别。
  • 可用于无符号整数。所有讨论同样适用于uint32_t/uint64_t,且无需担心符号位。

6. 总结

遇到形如A >= B * C且乘积可能溢出时,直接改写为A / C >= BC > 0)。这是一种简洁、可移植、无性能损失的防御技术,无需扩展整数宽度,就能彻底消除隐性溢出 bug。

在数值范围不可预知的接口中,养成这种写法习惯,能从源头避免难以复现的边界错误。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 18:26:05

终极BT下载加速指南:如何用trackerslist项目彻底解决下载慢问题

终极BT下载加速指南&#xff1a;如何用trackerslist项目彻底解决下载慢问题 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 你是否曾经面对BT下载时那令人沮丧的龟速进度条…

作者头像 李华
网站建设 2026/6/14 18:25:06

5分钟零代码实现:用自然语言彻底解放你的GUI重复操作

5分钟零代码实现&#xff1a;用自然语言彻底解放你的GUI重复操作 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desktop …

作者头像 李华
网站建设 2026/6/14 18:19:18

如何通过3个步骤让AI助手直接操作你的Obsidian知识库

如何通过3个步骤让AI助手直接操作你的Obsidian知识库 【免费下载链接】obsidian-local-rest-api A secure REST API and Model Context Protocol (MCP) server for your vault. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-local-rest-api 你是否曾经想过&am…

作者头像 李华
网站建设 2026/6/14 18:13:54

别再为不同网段发愁!手把手教你用家用路由器搞定VLAN划分与互通

家用路由器玩转VLAN&#xff1a;智能家居多网段隔离与互通实战指南你是否遇到过这样的困扰&#xff1a;家里智能电视疯狂占用带宽导致视频会议卡顿&#xff1f;访客连接WiFi时总担心他们误触NAS里的私人文件&#xff1f;或是办公室的打印机突然对所有设备可见带来安全隐患&…

作者头像 李华
网站建设 2026/6/14 18:13:15

终极指南:如何快速上手Bosca Ceoil Blue - 免费开源音乐创作工具

终极指南&#xff1a;如何快速上手Bosca Ceoil Blue - 免费开源音乐创作工具 【免费下载链接】boscaceoil-blue A beginner-friendly music making app. 项目地址: https://gitcode.com/gh_mirrors/bo/boscaceoil-blue 你是否曾经梦想创作自己的音乐&#xff0c;却觉得专…

作者头像 李华
网站建设 2026/6/14 18:12:46

SillyTavern性能瓶颈突破指南:3大策略实现AI聊天响应速度倍增

SillyTavern性能瓶颈突破指南&#xff1a;3大策略实现AI聊天响应速度倍增 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern SillyTavern作为面向高级用户的LLM前端工具&#xff0c;性能优化是…

作者头像 李华