问题:遇到两数相加超过数据类型所能存储的最大值,得到的结果会是负数,这是由于二进制中,计算机对于最高位认定为符号位,若两整数太大,相加后会让符号位从0变为1,下面以byte为例
下面两行是两个127,相加得到第一行的结果,结果为 -2,显然这不是我们想要得到的结果。那么如何解决呢?
在代码中解决整数溢出有两种方法。
我们先设置三个数
int m,l=0,r=Integer.MAX_VALUE;
如果只是单纯的 m=(l+r)/2,很容易造成溢出。
方法1、数学转换
// (l+r)/2 ==> l/2 + r/2 ==> l - l/2 + r/2 ==> l+(-l/2+r/2) ==> l+(r-l)/2
m = l+(r-l)/2;
l=m/2;
m = l+(r-l)/2;
这样得到的结果不会造成结果溢出。
方法2、移位
m = (l+r)>>>1; l=m/2; m = (l+r)>>>1;
个人推荐移位,对于移位的原理,在此就不赘述了,大家可以自己试一下