Java中的数字溢出

时间:2014-04-02 18:03:09

标签: java integer-overflow atoi

我想在 Java 中实现 C / C ++ atoi功能,下面是代码片段

    for (int j = 0; j < s.length(); j++) {

        int digit = Character.digit(s.charAt(j), 10);
        if (sum < limit/10) {
            if (neg) return Integer.MIN_VALUE;
            return Integer.MAX_VALUE;
        }

        sum *= 10;
        if (sum < limit + digit) {
            if (neg) return Integer.MIN_VALUE;
            return Integer.MAX_VALUE;
        }
        sum -= digit;
    }

对于行"if (sum < limit + digit) {",这是正确的,但是,如果我使用"sum - digit < limit",则会得到错误的结果,例如输入&#34; -2147483649&#34;,错误结果2147483647,应为-2147483648。

我想出来了,总和 - 数字可能会溢出,所以这又出现了另一个问题:

    int sum = Integer.MAX_VALUE;
    System.out.println(sum < Integer.MAX_VALUE + 1);

为什么打印错误?什么是逻辑背后?

3 个答案:

答案 0 :(得分:6)

Integer.MAX_VALUE + 1等于Integer.MIN_VALUE,如果以十六进制查看它们会更加明显:

Integer.MAX_VALUE = 0x7fffffff
                1 = 0x00000001
                    ---------- +
                    0x80000000

0x80000000也称为Integer.MIN_VALUE

显然没有int低于Integer.MIN_VALUE

此外,试图通过查看数字是否超过最大可能值来测试数字是否已经溢出从根本上是错误的。它不能超过最大可能值,这是什么&#34;最大可能&#34;&#34;暗示。此外,您不能查看数字,查看它,并确定它是否已溢出,因为每个数字都可能是非溢出计算的结果(实际上只是将其写为常量)并且作为计算溢出的结果。你需要知道你是如何得到这个号码的。

答案 1 :(得分:1)

如果您添加Integer.MAX_VALUE1,那么 总和将会溢出,因此sum将不会小于结果“总和”,{ {1}},所以它是Integer.MIN_VALUE

为了使其正常工作,您可以将false转换为Integer.MAX_VALUE,这样就不会发生溢出,并且比较可以正常进行。

long

输出:

System.out.println(sum < (long) Integer.MAX_VALUE + 1);

答案 2 :(得分:1)

仅供参考:Integer.parseInt(String)做你正在写的。


  

为什么打印错误?什么是逻辑背后?

System.out.println(sum < Integer.MAX_VALUE + 1);

这打印为false,因为Integer.MAX_VALUE + 1 == Integer.MIN_VALUE。所以这等同于

System.out.println(sum < Integer.MIN_VALUE);

没有任何小于最小值。