我已经为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的计算正在给我以前的回答吗?我们的想法是检查新的溢出值是否会在操作颠倒时产生旧的结果。
如果这是检查溢出错误的错误方法,有人可以告诉我正确的方法吗?
答案 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
要编写检查以检测溢出,您只需比较ans
和temp
的值。
if(ans > temp) {
// there was an overflow
...
}