【问题标题】:Java integer overflowJava 整数溢出
【发布时间】:2017-03-08 17:55:46
【问题描述】:

我是 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。我真的不知道这里出了什么问题。谁能帮我理解这个?

【问题讨论】:

标签: java integer-overflow


【解决方案1】:

考虑这个例子

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中有二进制加法。它使用一种称为二进制补码的表示,其中数字的第一位表示其符号。每当你给最大的 Integer(MAX INT) 加 1,它的位符号为 0,那么它的位符号变为 1,数字变为负数。

所以,不要将 > MAX INT 作为输入,否则在代码中添加一个条件来检查输入本身。

【讨论】:

    【解决方案2】:

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

    它会环绕到您观察到的负数,因此请考虑该结果。

    【讨论】:

    • 是的,我知道这是对的。但实际上输入是一个字符串,我想将其转换为 int。
    猜你喜欢
    • 2014-06-08
    • 2022-01-21
    • 2014-01-24
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多