美文网首页
判断两个int值相加怎么知道有没有溢出

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

作者: 李die喋 | 来源:发表于2019-09-27 20:33 被阅读0次

判断两个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数值范围会溢出。

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

相关文章

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

    判断两个int值相加怎么知道有没有溢出 这个题是我在看一个人的面经的时候看到的。感觉自己好菜,知道要从计算机两个整...

  • IL指令字典

    Add 将两个值相加并将结果推送到计算堆栈上。Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆...

  • Java算法之TwoSum

    给定一个int数组,其中两个数相加等于一个特定值,返回这两个数的索引 示例 int数组: [2, 7, 11, 1...

  • Java算法之TwoSum

    给定一个int数组,其中两个数相加等于一个特定值,返回这两个数的索引 示例int数组: [2, 7, 11, 15...

  • 判断整型运算是否溢出

    加法溢出: 无符号整数溢出判断较简单 有符号整数溢出的时候只存在正溢出和负溢出两种情况,即两正数相加得到一个负数或...

  • Java 基础

    两个byte类型的数据相加时,各自自动提升为int类型,两个int数值相加的和可能会超过byte的范围,所以会报错

  • JS运算符及显示隐式类型转换

    加法规则 布尔值和布尔值相加、数字和布尔值相加。布尔值默认会自动转成数值,然后相加。 两个字符串相加。这时加法运算...

  • 7.反转整数 by 2018-04-22

    本题关键点在于溢出的判断: 检查溢出的不等式来自于:res * 10 + x % 10 > INT_MAX。此不等...

  • 1.two sum

    题目大意:给出一个int数组,和一个目标数字。求出该数组中哪两个的值相加等于目标数字,返回两个值得数组下标。

  • 求最大值,中间值的小技巧

    int a,b; 两个数的最大值:int max =( a+b+abs(a-b))/2; 两个数的最小值:int ...

网友评论

      本文标题:判断两个int值相加怎么知道有没有溢出

      本文链接:https://www.haomeiwen.com/subject/odbjyctx.html