如何判断整数运算是否溢出

前言

固然可以使用一个更大范围的数来保存结果并判断是否溢出,但如果已经是系统或语言支撑的最大整数类型了呢?

先给出结论:
对于无符号整数
运算类型溢出类型判断没有溢出注意
s=x+y可能上溢s≥x不能使用s-x==y来判断
s=x-yx<y时会下溢x>=yNA
m=x*y可能上溢(x==0&&m==0) || (x!=0&&m/x==y)NA
m=x/y不会溢出1==1NA
对于有符号整数
运算类型溢出类型如何判断注意
s=x+y可能上溢或下溢!((x>=0&&y>=0&&s<0)||(x<0&&y<0&&s>=0))NA
s=x-y可能上溢或下溢!((x<0&&y>0&&s>=0)||(x>0&&y<0&&s<=0))NA
m=x*y可能上溢!x || m/x==yNA
m=x/y不会溢出NANA

证明

无符号整数
  • s=x+y
    两个正整数相加可能会上溢,根据我们给出的判断方法,我们需要证明只要s大于等于x、y中任意一个,则说明没有溢出。
  1. 我们要证明当s>=x时没有溢出,先讨论x、y的大小:如果x>=y,则s>=x会传递到s>=y,符合加法性质;如果x<y,则要证明当s>=min(x,y)时,依旧能判断是否溢出;
  2. 使用反证法,我们假设当s>=x时有溢出,则溢出值s’=x+y-MAX,有x+y-MAX>=x,有y>=MAX,当取等号时,y=MAX,x=0,s’=0时,没有溢出但是还是有s>=x,与假设矛盾;如果取大于号,显然与定义矛盾,从而得证。
  3. 再证明使用s-x==y不能判断是否溢出,我们这里取3位无符号整数,MAX=8,x=4,y=5,则s=x+y-MAX=1发生溢出,但s-x=-3在无符号是5 == y。
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值