2016-10-19 6 views
1

私は入力2は、それがinfinitly正しく最初の4つの正方形を行い、その後、出力がゼロになるとき、それはしかし1000000数回実行した後、繰り返し入力入力の出力をゼロにするループ。何が間違っていますか?

while(n<1000000){ 
    n=n*n; 
    System.out.println(n); 
    count++; 
} 

を超えるまで、数を二乗続行するには、このループを書きました。なぜ私はプログラミングに新しいので、いくつかの助けが大好きです。

+4

'2'を入力すると' 4'、 '16'、' 256'、 '65536'、' 0'、...と表示されます。 '65536 * 65536'とは何ですか? '4,294,967,296'。 'int'の最大値は何ですか? '2,147,483,647'。 'int'値はオーバーフローし、オーバーフローして' 0'値になります。 *解決法:* 'n'を' long'に変更して、 '999,999 * 999,999 = 999,998,000,001'をあふれさせることなく処理できます。 – Andreas

+0

タイプを変更する必要があります。 – ChiefTwoPencils

+0

'int'の代わりに' long'を使うと '9,223,372,036,854,775,807'まで上がることができます。あなたはもう1歩歩く余裕があります。 – Gendarme

答えて

1

intの最大値は2147483647です。65536 * 65536の結果は0にオーバーフローします。その後、0 * 0は永久に増やされます。

4.2.1:

は、プリミティブ型の取り得る値についての詳細を調べるためにJava specを見てください。整数型と整数型の

値は、以下の範囲内の整数である値:バイトの場合

  • 、-128から127まで、略して
  • 含めて、-32768からまで32767、int型の場合
  • 、-2147483648から2147483647まで包括的
  • 含めて、-9223372036854775808から9223372036854775807まで、長い間
  • 包括「\ U0000」からcharの
  • 、「\ uffff」つまり、包括的、0から編集

65535:彼のコメントにアンドレアスで説明したように、あなたが長い間使用している場合、それは動作します。

0

これは整数のオーバーフローによるものです。

あなたはn = n * nを行っているので、それは前の数字の2乗です。たとえば、最初にn = 2の場合、 ループ1: n = 2 * 2 = 4の場合は 、 ループ2: n = 4 * 4 = 8; ループ3: n = 8 * 8 = 64; ...ループK: N = 2^K * 2^K = 2^2K

その数回の反復後2147483647整数の記憶容量をオーバーフローしよう。これは、nが原因のJava整数オーバーフローに0に割り当てさせる4294967296 で計算 2^32が0 に割り当てることによって処理されるあなたは4回の反復後

これはその後0のままであり、として無限に継続します終了条件を決して満たしません。

+1

intの最小値が-2147483648であるため、これは正しくありません。 – dudel

+0

訂正してくれてありがとう、私はそれがオーバーフローの後に0に割り当てられることを示唆することを意味した。 0は可能な最小値ではありません。私は編集を行います。 – Bijoy

関連する問題