繁体   English   中英

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

[英]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溢出时,这将停止。

这是由于所谓的整数溢出。 当您将1加到MAX_VALUE ,如果您使用带符号整数,则将获得MIN_VALUE 0如果使用无符号整数,则将获得0

简要说明一下,例如,当您将1加到99 ,您必须两次携带1才能出现在第三位数字: 100 但是,如果您最多只允许输入2位数字,那么请携带两位数,最后以00结束。 在计算机中,允许的位数(二进制数字)有限,通常为32或64。

你可以在这里读更多关于它的内容:
Wiki整数溢出
有符号与无符号整数

除了由于从未达到最大整数值而使您陷入无限循环的其他答案之外,您可能还应该在循环内添加打印,以便可以看到进度:

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.rangeClosedLongStream.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM