判断两个64位无符号整数a和b相加是否溢出

64位无符号整数的范围为0 ~ 18446744073709551615 (2^64 - 1)

所以要判断两个64位无符号整数(x, y)相加有没有溢出只要看 x + y 是否大于 18446744073709551615

用 x + y > 18446744073709551615 来判断溢出的话可以用大数

下面用计算机原理分析:
把18446744073709551615 (2^64 - 1)写成二进制形式是
111111........11111111  (64个1)

把1写成二进制形式是
000000........00000001

  111111........11111111
+ 111111........11111111
=1111111........11111110

  111111........11111111
+ 000000........00000001
=1000000........00000000

可以看到进位了一个1 => 任何两个数相加造成溢出的话,都会进位一个1

根据计算机原理,我们会得到的结果是111111........11111110(2^64 - 1 + 2^64 - 1 - 2^64),系统会去掉那个进位

可以得到两个结论:
1).没有溢出的时候:z = x + y => (z >= x && z >= y)
2).溢出的时候:
z = x + y - 2^64
y - 2^64 < 0
z = x + y - 2^64 < x
同理z = x + y - 2^64 < y

总结:因为没有溢出的时候 (z >= x && z >= y), 所以我们只要判定z < x是否成立来判定是否溢出即可
因为要么溢出,要么不溢出,没有其他情况了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值