2016-03-24 74 views
0

我只是試圖將數字從1添加到Integer.MAX_VALUE,但在輸出中我什麼都沒有。該計劃介於兩者之間。以下是我創建的課程。爲什麼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); 
    } 
} 

有沒有人有任何想法,爲什麼這是掛。該計劃從未完成。

如何解決這類問題?

+2

您可以通過替換'INT START_VALUE = 1解決這個問題;''來長START_VALUE = 1;'。 –

+0

非常感謝你的答案。 – user2601809

回答

2

這是因爲所謂的整數溢出。當您將1添加到MAX_VALUE時,如果使用的是有符號整數,則得到MIN_VALUE,如果使用無符號整數,則得到0

簡要說明,當您添加到199例如,你必須攜帶1兩次,最終在第三位:100。但是,如果您只允許使用最多2位數字,則您攜帶兩次,最後輸入00。在計算機中,有位的數量有限(二進制位)允許,通常爲32或64

你可以閱讀更多關於它在這裏:
Wiki Integer Overflow
Signed vs Unsigned Integers

+0

謝謝... 得到答案 – user2601809

3

應該永遠不會完成你有一個無限循環。

你的循環實際上是

while(start_value <= Integer.MAX_VALUE) { 

但Integer.MAX_VALUE的是最大的定義,因此是有效的

while (true) { 

您可以更改循環做你需要什麼

​​

這樣你就可以在問題發生之前發現問題。

的鈍解決方案可能是

for (int i = 1; i > 0; i++) 
    sum += i; 

這時候i溢出停止。

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 

    } 
} 
0

由於其他答案中指出的原因,對基本類型的最大值或最小值所限定的區間進行迭代可能非常棘手。

Java 8允許使用新的解決方案,因爲可以使用IntStream.rangeClosedLongStream.rangeClosed

在你的情況,你可以做

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

或只是

LongStream.rangeClosed(1, Integer.MAX_VALUE).sum(); 
相關問題