当前位置: 首页 > news >正文

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

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

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

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。

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

http://www.jsqmd.com/news/1013404/

相关文章:

  • 重塑链上未来的隐形基石:长期主义下的生态演进
  • Google 爬虫工作原理,及用Python实现完整的Google爬虫
  • NSK LPFC 1616-3 高刚性零背隙滚珠丝杠技术解析
  • 2026年除尘器滤芯厂家靠谱推荐@拿货质保认准滤芯芳姐? - 速递信息
  • AI 辅助的云原生容量规划:从负载预测到资源推荐的自适应策略
  • 文档下载神器kill-doc:如何三分钟搞定全网30+平台免费文档下载?
  • Wayback Machine浏览器扩展:让消失的网页永远触手可及的数字时光机
  • 你的会议麦克风真的‘智能’吗?拆解ANS噪声抑制在腾讯会议、Zoom里的实际表现
  • 5分钟掌握Arduino红外遥控:从零开始的完整教程
  • OpenPLC Editor终极指南:如何免费创建工业自动化程序
  • 2026天津黄金回收诚信TOP7门店榜单:七家透明商户告别变现套路,三十年口碑硬核护航 - 薛定谔的梨花猫
  • 深入解析wxapkg-convertor:5步掌握微信小程序反编译核心技术
  • 2026沈阳门窗公司对比测评:优选沈阳优顿门窗 - 速递信息
  • 国内餐饮设计公司推荐:从空间美学到经营全案的机构盘点 - 品牌速递
  • WaveTools抽卡记录终极指南:如何精准管理你的抽卡数据与保底计算
  • DolphinScheduler 3.x 集群部署避坑指南:从零到生产环境的完整配置流程
  • 安能物流40公斤收费标准?安能物流40公斤寄件多少钱?2026最新收费详解 - 快递物流资讯
  • 2026宁波AI搜索优化服务商深度评测:谁是宁波企业的最优选? - 品牌报告
  • 终极iOS越狱指南:2026年如何安全解锁iPhone全部潜能
  • 基于MATLAB的静止无功补偿系统设计3(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 2026杭州黄金回收诚信:这7家透明商户让变现真正省心,三十年口碑护航 - 薛定谔的梨花猫
  • 终极LRC歌词批量下载指南:10分钟让离线音乐库焕发新生
  • dex2jar终极指南:Android逆向工程与DEX转换的完整解决方案
  • 西湖区处理全套附件大牌包,奢二网专业鉴定爱马仕Kelly、铂金包 - 讯息早知道
  • 如何在3小时内搭建你自己的怀旧传奇服务器:OpenMir2终极指南
  • AI 辅助的前端国际化文案本地化策略:从机械翻译到语境适配,多语言产品的智能交付
  • eLabFTW终极指南:5个简单步骤搭建你的开源电子实验记录本
  • 【信息科学与工程学】【通信工程】【安全领域】第二百零三篇 防火墙设备中的学科知识03
  • 2026年值得关注的口碑较好工艺品设计服务排名
  • 肇庆四会高性价比酒店判定指南 实测维度拆解 - 奔跑123