Java整数溢出

时间:2017-03-08 17:55:46

标签: java integer-overflow

我是Java新手,我正在实现一个简单的函数,可以在Leetcode上将字符串转换为整数。

public int myAtoi(String str) {
    if(str.length() == 0){
        return 0;
    }
    str = str.trim();
    int n = str.length();

    int signal = 0;
    if(n == 1 && str.equals("+") || str.equals("-")){
        return 0;
    }
    if(str.charAt(0) == '+'){
        signal = 1;
    }else if(str.charAt(0) == '-'){
        signal = -1;
    }

    int i = (signal != 0)? 1 : 0;
    if(signal == 0){
        signal = 1;//default
    }

    int res = 0;
    while(i < n){
        char c = str.charAt(i);
        if(!Character.isDigit(c)){
            return res * signal;
        }
        //res = res * 10 + c - '0';
        if(signal * res > Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }
        if(signal * res < Integer.MIN_VALUE){
            return Integer.MIN_VALUE;
        }
        res = res * 10 + c - '0';
        ++i;
    }
    return res * signal;
}

我知道java整数的MAX_VALUE2147483647。当我的输入为2147483648时,输出应为2147483647,但确实为-214748648。我真的不知道这里有什么问题。任何人都可以帮我理解这个吗?

2 个答案:

答案 0 :(得分:2)

输入永远不会是+2147483648,因为该值不能表示为Java int。

它会回绕你观察到的负数,因此要考虑到这个结果。

答案 1 :(得分:2)

考虑这个例子

public static void main(String args[]) {
    int i=2147483647;
    System.out.println("i="+i);
    int j=++i;
    System.out.println("Now i is="+i);
    System.out.println("j="+j);
}

会发生什么? 输出将是:

i = 2147483647
Now i is=-2147483648
j=-2147483648

整数的最大值为2,147,483,647,最小值为-2,147,483,648。这里的j(i的后增量),我们已超过整数

的最大限制

这正是你案件中正在发生的事情。

因为整数溢出。当它溢出时,下一个值为Integer.MIN_VALUE

<强>为什么吗

  

整数值以二进制形式表示,并且在java中有二进制加法。它使用称为二进制补码的表示,其中数字的第一位表示其符号。无论何时将1加到最大的整数(MAX INT),其位符号为0,其位符号变为1,数字变为负数。

所以,不要把&gt; MAX INT作为输入,否则在您的代码中添加一个条件以在输入本身上检查它。