Integer.MIN_VALUE除以-1

5

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

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

问题:

不使用乘法、除法和取模运算符,实现两个整数的除法。

如果发生溢出,返回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个回答

8

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

  • Integer.MAX_VALUE2147483647
  • Integer.MIN_VALUE-2147483648

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


2

Java使用32位存储int

int的最大值为231-1。

0111 1111 1111 1111 1111 1111 1111 1111

最小的 int 值是 -231

1000 0000 0000 0000 0000 0000 0000 0000

换句话说,int类型不能存储2的31次方(即-Integer.MIN_VALUE)这么大的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接