在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;
}
为什么 结果 - =数字 而不是结果+ =数字?我很困惑。
答案 0 :(得分:5)
代码有一条评论:“积极消极避免MAX_VALUE附近的意外”
在解析数字时,代码会将数字添加到累加器变量result
。
现在,作者想要编写代码,仅在累加器中为正数和负数建立一次数。
然后当它完成时,它会向它添加标志;如果数字前面有一个减号字符,结果将为负数,否则为正数。
问题是整数的数字范围对于正数和负数都不对称。适合int
的最小负数是-2147483648,但是如果是2147483647则是最大的正数。
如果result
局部变量中的数字保持为正数,则无法解析负数-2147483648。
这就是为什么代码在结束前保持负数 - 因为负数的范围足够大以容纳所有正数,而正数的范围是一个数字太小而不能容纳所有负数。