判断两个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是否成立来判定是否溢出即可
因为要么溢出,要么不溢出,没有其他情况了

 

你可能感兴趣的:(计算机组成原理)