[英]Why is Integer.MAX_VALUE+1 smaller than Integer.MAX_VALUE?
我只是想将数字从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);
}
}
有人知道为什么这挂了吗? 该程序永远不会完成。
如何解决这类问题?
它永远不会完成,因为您有无限循环。
您的循环有效
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
溢出时,这将停止。
除了由于从未达到最大整数值而使您陷入无限循环的其他答案之外,您可能还应该在循环内添加打印,以便可以看到进度:
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
}
}
由于其他答案中指出的原因,在原始类型的最大值或最小值所限制的时间间隔内进行迭代可能非常棘手。
Java 8允许对此提出新的解决方案,因为可以使用IntStream.rangeClosed
和LongStream.rangeClosed
。
就您而言,您可以
IntStream.rangeClosed(1, Integer.MAX_VALUE).mapToLong(i -> i).sum();
要不就
LongStream.rangeClosed(1, Integer.MAX_VALUE).sum();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.