2016-03-24 8 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

を行うことができますあなたの場合は

;' '長いSTART_VALUE = 1へ;'。 –

+0

ありがとうございました。 – user2601809

答えて

2

これは、整数オーバーフローという理由によるものです。 をMAX_VALUEに追加すると、符号付き整数を使用する場合はMIN_VALUE、符号なし整数を使用する場合は0が得られます。 100

簡単に言えばあなたは、たとえば991を追加するとき、あなたは3桁目に終わるために二回1を運ぶために持って、説明しました。しかし、最大2桁しか許されていない場合は、その数字を2回持ち、00になります。コンピュータでは、ビットの限られた数(バイナリ桁)許可があり、通常は32または64

あなたがここでそれについての詳細を読むことができます:
Wiki Integer Overflow
Signed vs Unsigned Integers

+0

ありがとう... 答えを得ました – user2601809

3

それはあなたが持っているような完全なん無限ループ

あなたのループを効果的

while(start_value <= Integer.MAX_VALUE) { 

ですが、

while (true) { 

あなたはあなたが必要なものを行うためにループを変更することができる効果があるので、Integer.MAX_VALUEでは、定義により、最大で

​​

この方法では、問題が発生する前にこれを検出できます。

鈍角のソリューションは、ときiオーバーフロー

for (int i = 1; i > 0; i++) 
    sum += 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

他の答えに示されている理由から、プリミティブ型の最大値または最小値で囲まれた間隔で繰り返すことは非常に難しいことがあります。

IntStream.rangeClosedLongStream.rangeClosedが使用できるため、Java 8ではこれに新しいソリューションが使用できます。、あなたはあなたがint START_VALUE = 1 `置き換えることによって、この問題を解決することができ

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

か、単に

LongStream.rangeClosed(1, Integer.MAX_VALUE).sum(); 
関連する問題