Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Integer.MIN_值除以-1 为什么这行代码很重要?(没有它我会得到一个错误的答案) 问题是:_Java_Integer Overflow - Fatal编程技术网

Java Integer.MIN_值除以-1 为什么这行代码很重要?(没有它我会得到一个错误的答案) 问题是:

Java Integer.MIN_值除以-1 为什么这行代码很重要?(没有它我会得到一个错误的答案) 问题是:,java,integer-overflow,Java,Integer Overflow,不使用乘法、除法和mod运算符对两个整数进行除法 如果溢出,则返回2147483647 答复 公共整数除法(整数除法,整数除法){ 如果(除数=0){ 返回红利>0?整数.MAX\u值:整数.MIN\u值; } 如果(股息==0){ 返回0; } 如果(被除数==Integer.MIN_值和除数==-1){ 返回Integer.MAX_值; } 布尔值isNeg=(被除数>0&&除数=向下){ int-shift=0; 而(向上>=(向下因为,Integer.MAX\u VALUE和Intege

不使用乘法、除法和mod运算符对两个整数进行除法

如果溢出,则返回2147483647

答复
公共整数除法(整数除法,整数除法){
如果(除数=0){
返回红利>0?整数.MAX\u值:整数.MIN\u值;
}
如果(股息==0){
返回0;
}
如果(被除数==Integer.MIN_值和除数==-1){
返回Integer.MAX_值;
}
布尔值isNeg=(被除数>0&&除数<0)| |(被除数<0&&除数>0);
多头上涨=数学绝对值((多头)股息);
Long down=Math.abs((长)除数);
int res=0;
while(向上>=向下){
int-shift=0;

而(向上>=(向下因为,
Integer.MAX\u VALUE
Integer.MIN\u VALUE
的绝对值不相等

  • 整数。最大值
    2147483647
  • Integer.MIN\u值
    -2147483648

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

Java使用32位存储
int

最大int值为231-1

最小int值为-231

换句话说,int没有足够大的值来存储231(
-Integer.MIN_value

if (dividend == Integer.MIN_VALUE && divisor == -1) {
    return Integer.MAX_VALUE;
}
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;
}
0111 1111 1111 1111 1111 1111 1111 1111
1000 0000 0000 0000 0000 0000 0000 0000