为什么Integer.paseInt()算法最终在sun jdk中计算负面结果

时间:2016-10-21 02:01:31

标签: java algorithm jdk1.6

在jdk源代码中,我对Integer的parseInt(String str,int radix)algorithm.let有一些疑问,请参阅下面的代码源。

        multmin = limit / radix;
        while (i < len) {
            // Accumulating negatively avoids surprises near MAX_VALUE
            digit = Character.digit(s.charAt(i++),radix);
            if (digit < 0) {
                throw NumberFormatException.forInputString(s);
            }
            if (result < multmin) {
                throw NumberFormatException.forInputString(s);
            }
            result *= radix;
            if (result < limit + digit) {
                throw NumberFormatException.forInputString(s);
            }
            result -= digit;
        }

为什么 结果 - =数字 而不是结果+ =数字?我很困惑。

1 个答案:

答案 0 :(得分:5)

代码有一条评论:“积极消极避免MAX_VALUE附近的意外”

在解析数字时,代码会将数字添加到累加器变量result

现在,作者想要编写代码,仅在累加器中为正数和负数建立一次数。

然后当它完成时,它会向它添加标志;如果数字前面有一个减号字符,结果将为负数,否则为正数。

问题是整数的数字范围对于正数和负数都不对称。适合int的最小负数是-2147483648,但是如果是2147483647则是最大的正数。

如果result局部变量中的数字保持为正数,则无法解析负数-2147483648。

这就是为什么代码在结束前保持负数 - 因为负数的范围足够大以容纳所有正数,而正数的范围是一个数字太小而不能容纳所有负数。