整数溢出查询

时间:2017-05-10 21:23:48

标签: java integer overflow

我已经为ATOI编写了以下程序(String to Intger conversion)。我正在尝试检测整数溢出错误,如果我正在进行的答案高于或低于它。 但我得到以下错误。

 public class Solution {
 public int myAtoi(String str) {
    int index = 0;
    boolean isPos = true;
    int temp = 0;
    int ans = 0;
    int present = 0;
    if(str==null || str.length()==0){
        return 0;
    }
    while(index<str.length() && (str.charAt(index)<48 || str.charAt(index)>57)){
        index++;
    }
    if(index-1>=0 && str.charAt(index-1)=='-'){
        isPos = false;
    }
    if(index<str.length()){
        ans = str.charAt(index++)-'0';
    }
    else{
        return 0;
    }
    while(index<str.length() && (str.charAt(index)>=48 && str.charAt(index)<=57)){
        present = str.charAt(index)-'0';
        temp = ans*10 + present;
        System.out.println("ans= "+ans + " temp= "+temp + " (temp-present)/10= "+ (temp-present)/10);
        if((temp-present)/10 != ans){
            ans = Integer.MAX_VALUE;
            break;
        }
        ans = temp;
        index++;
    }
    if(!isPos){
        ans = -ans;
    }

    return ans;
 }
}

以上的输出结果如下:

 ans= 2 temp= 21 (temp-present)/10= 2
 ans= 21 temp= 214 (temp-present)/10= 21
 ans= 214 temp= 2147 (temp-present)/10= 214
 ans= 2147 temp= 21474 (temp-present)/10= 2147
 ans= 21474 temp= 214748 (temp-present)/10= 21474
 ans= 214748 temp= 2147483 (temp-present)/10= 214748
 ans= 2147483 temp= 21474836 (temp-present)/10= 2147483
 ans= 21474836 temp= 214748364 (temp-present)/10= 21474836
 ans= 214748364 temp= -2147483648 (temp-present)/10= 214748364

有人能告诉我为什么我的临时数会像预期的那样是负数,但是(临时存在)/ 10的计算正在给我以前的回答吗?我们的想法是检查新的溢出值是否会在操作颠倒时产生旧的结果。

如果这是检查溢出错误的错误方法,有人可以告诉我正确的方法吗?

2 个答案:

答案 0 :(得分:0)

如果您想防止溢出,请使用&#34; exact&#34; Math的方法(在Java 8中添加):

// Old code
temp = ans*10 + present;
// New code
try {
    temp = Math.addExact(Math.multiplyExact(ans, 10), present);
} catch (ArithmeticException e) {
    temp = Integer.MAX_VALUE;
}

或者,如果您不想这样做,因为present是0-9,所以以下测试就足够了,因为temp的唯一方法是ans,溢出为负值:

if (temp < ans) // overflowed

答案 1 :(得分:0)

  

Integer类的最小值为-2,147,483,648,最大值为2,147,483,647(含)

temp= 214748364之后的迭代如下

present = str.charAt(index)-'0'; // saves the integer 8
temp = ans*10 + present;         // 2147483640 + 8 

为了更好地理解,让我们分解一下 2147483640 + 7 + 1 = 2147483647 (which is the max limit) + 1
这将循环通过整数范围,从而更改为-2147483648

要编写检查以检测溢出,您只需比较anstemp的值。

if(ans > temp) {
  // there was an overflow
  ...
}