为什么Integer.MAX_VALUE + 1小于Integer.MAX_VALUE?

时间:2016-03-24 17:42:09

标签: java

我只是尝试将数字从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);
    }
 }

有人知道为什么会这样。该计划永远不会完成。

如何解决这类问题?

4 个答案:

答案 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.rangeClosedLongStream.rangeClosed

在您的情况下,您可以

IntStream.rangeClosed(1, Integer.MAX_VALUE).mapToLong(i -> i).sum();

或只是

LongStream.rangeClosed(1, Integer.MAX_VALUE).sum();