我想在 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);
为什么打印错误?什么是逻辑背后?
答案 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_VALUE
和1
,那么 总和将会溢出,因此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);
没有任何小于最小值。