Math.addExact 是如何判断溢出的

2020-05-15  本文已影响0人  王灵

知识点

1、二进制符号位

在二进制码中,为了区分正负数,采用最高位是符号位的方法来区分,正数的符号位为0、负数的符号位为1.剩下的就是这个数的绝对值部分,

2、& ~ | ^ 运算符

3、算术溢出

在定点计算机中,从正方向超过了数的表示范围,称为上溢;从负方向超过了数的表示范围,则称为下溢
上溢会得到一个最大的负数,下溢获得到一个最大的正数;

分析

算术溢出只可能发生在两个正数的和是负数,或者两个负数的和是正数;

public static int addExact(int x, int y) {
        int r = x + y;
        // HD 2-12 Overflow iff both arguments have the opposite sign of the result
        if (((x ^ r) & (y ^ r)) < 0) {
            throw new ArithmeticException("integer overflow");
        }
        return r;
    }

((x ^ r) & (y ^ r)) < 0
->((x ^ r) & (y ^ r)) < 0的符号位是1
->(x ^ r)(y ^ r)的符号位都是1
->xr的符号位不同 ; yr的符号位不同
->xy的符号位是相同的,且与r的符号位不同
->两个符号位相同的数相加却得到了一个符号位不同的和
->溢出了

上一篇 下一篇

猜你喜欢

热点阅读