整数.MIN_VALUE除以-1

时间:2018-08-21 16:39:07

标签: java integer-overflow

为什么这行代码很重要?(如果没有它,我会得到一个错误的答案)

if (dividend == Integer.MIN_VALUE && divisor == -1) {
    return Integer.MAX_VALUE;
}

问题:

不使用乘法,除法和mod运算符将两个整数相除。

如果溢出,则返回2147483647

答案

public int divide(int dividend, int divisor) {

    if(divisor == 0){
        return dividend > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
    }

    if(dividend == 0){
        return 0;
    }

    if (dividend == Integer.MIN_VALUE && divisor == -1) {
        return Integer.MAX_VALUE;
    }

    boolean isNeg = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);


    Long up = Math.abs((long) dividend);
    Long down = Math.abs((long) divisor);

    int res = 0;

    while(up >= down){
        int shift = 0;

        while(up >= (down << shift)){
            shift++;
        }

        up -= down << (shift - 1);
        res += 1 << (shift - 1);
    }

    return isNeg ? -res : res;
}

2 个答案:

答案 0 :(得分:6)

因为Integer.MAX_VALUEInteger.MIN_VALUE的绝对值不相等。

  • Integer.MAX_VALUE2147483647
  • Integer.MIN_VALUE-2147483648

如果将Integer.MIN_VALUE除以-1,该值将溢出(2147483648 > 2147483647),因此此操作必须有一个限制。

答案 1 :(得分:1)

Java使用32位存储int

最大int值为2 31 -1

0111 1111 1111 1111 1111 1111 1111 1111

最小int值为-2 31

1000 0000 0000 0000 0000 0000 0000 0000

换句话说,int没有足够大的值来存储2 31 -Integer.MIN_VALUE)。