判断两个int值相加怎么知道有没有溢出
这个题是我在看一个人的面经的时候看到的。感觉自己好菜,知道要从计算机两个整数相加是否有会超过32位被截断讲起。当时计导课讲过,当时就没有深入想,早该总结的东西拖到了现在。现在就开始总结一下。
原码、反码、补码的相互转化作为一名计算机的学生应该都很清楚了。整数的范围是-2^31 ~ 2^31-1,也就是[-2147483648,2147483647]。
- -2147483648
二进制:1000 0000 0000 0000 0000 0000 0000 0000
- 2147483647
二进制: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数值范围会溢出。
希望这篇博客能帮到和我一样还不太能说明白的人==







网友评论