判断两个int值相加怎么知道有没有溢出

2019-09-27  本文已影响0人  李die喋

判断两个int值相加怎么知道有没有溢出

这个题是我在看一个人的面经的时候看到的。感觉自己好菜,知道要从计算机两个整数相加是否有会超过32位被截断讲起。当时计导课讲过,当时就没有深入想,早该总结的东西拖到了现在。现在就开始总结一下。

原码、反码、补码的相互转化作为一名计算机的学生应该都很清楚了。整数的范围是-2^31 ~ 2^31-1,也就是[-2147483648,2147483647]。

二进制:1000 0000 0000 0000 0000 0000 0000 0000

二进制:0111 1111 1111 1111 1111 1111 1111 1111

最主要的是要搞清楚-2147483648这个数是怎么来的。

我们都知道最高位是符号位,那么-2147483647用二进制表示就是1111 1111 1111 1111 1111 1111 1111 1111。

(-2147483647)+(-1)等于两个数的补码相加,转化成源码就是其值。这两个数的补码值相加后为1000 0000 0000 0000 0000 0000 0000 0000。可以发现这个值和-2147483648的二进制相同,这是为什么呢?问题先放到这里,后面再做解释。

我们再想一下零的问题。

二进制:0000 0000 0000 0000 0000 0000 0000 0000

二进制:1000 0000 0000 0000 0000 0000 0000 0000

但是计算机里是以补码计算的,正零的补码是它本身,负零的补码是它的源码除了符号位不变其余位全取返再加一,由于溢出以为,所以为0000 0000 0000 0000 0000 0000 0000 0000。

负零的补码为0,和正零相同。所以没有必要区分正零和负零,但是这样就多出来一个数:1000 0000 0000 0000 0000 0000 0000 0000,刚好这个值和之前我们分析的(-2147483647)+(-1)的补码值相同,他们俩相加刚好等于-2147483648。所以就规定了1000 0000 0000 0000 0000 0000 0000的值为-2147483648。

那么

(-2147483648)+(-1) = ?

2147483647+1=?

写个程序的话可以看到他们分别等于2147483647、-2147483648。可以发现两个正数相加,若溢出,符号位改变;两个负数相加,若溢出,符号位也改变。

因此,在判断两个int值相加时,若溢出,则他们计算出的值与我们实际计算的值不符。原因就是计算机int值数运算时若超过int数值范围会溢出。

希望这篇博客能帮到和我一样还不太能说明白的人==

上一篇 下一篇

猜你喜欢

热点阅读