我只是尝试将数字从1添加到Integer.MAX_VALUE,但在输出中我什么都没得到。该计划介于两者之间。以下是我创建的课程。
public class Test {
public static void main(String args[]) {
long sum = 0;
int start_value = 1;
long end_value = Integer.MAX_VALUE;
while(start_value <= end_value){
sum += start_value;
start_value++;
}
System.out.println(sum);
}
}
有人知道为什么会这样。该计划永远不会完成。
如何解决这类问题?
答案 0 :(得分:3)
它应该永远不会完成,因为你有一个无限循环。
你的循环实际上是
while(start_value <= Integer.MAX_VALUE) {
但Integer.MAX_VALUE根据定义是最大的,因此它是有效的
while (true) {
您可以更改循环以执行您需要的操作
int start_value = 0;
while(start_value < end_value) {
start_value++;
sum += startValue;
}
这样你就可以在失败之前发现问题。
一个迟钝的解决方案可能是
for (int i = 1; i > 0; i++)
sum += i;
当i
溢出时,这将停止。
答案 1 :(得分:2)
这是因为称为整数溢出的东西。当您向1
添加MAX_VALUE
时,如果使用有符号整数,则获得MIN_VALUE
;如果使用无符号整数,则获得0
。
简要说明,例如,当您将1
添加到99
时,您必须携带1
两次以结束第三位数字:100
。但是,如果您只允许最多2位数,那么您将携带两位数,最后得到00
。在计算机中,允许的位数(二进制数字)有限,通常为32或64.
你可以在这里阅读更多相关信息:
Wiki Integer Overflow
Signed vs Unsigned Integers
答案 2 :(得分:0)
除了你因无法达到最大整数值而陷入无限循环的其他答案之外,你应该在循环中添加一个打印,这样你就可以看到进度:
public class Test {
public static void main(String args[]) {
long sum = 0;
int start_value = 1;
int end_value = Integer.MAX_VALUE - 1;//Just in case
while(start_value <= end_value){
sum += start_value;
start_value++;
//Print every 100 loops, change this if it prints too often
if (start_value % 100 == 0){
System.out.println("integer at: " + start_value + ", sum: " + sum);
}
}
System.out.println(sum + Integer.MAX_VALUE);//Since we only went to Integer.MAX_VALUE -1
}
}
答案 3 :(得分:0)
由于其他答案中指出的原因,迭代由基本类型的最大值或最小值限制的区间可能非常棘手。
Java 8允许使用新的解决方案,因为可以使用IntStream.rangeClosed
和LongStream.rangeClosed
。
在您的情况下,您可以
IntStream.rangeClosed(1, Integer.MAX_VALUE).mapToLong(i -> i).sum();
或只是
LongStream.rangeClosed(1, Integer.MAX_VALUE).sum();