2016-09-12 5 views
0

以下のコードを実行すると、いくつかのアンドロイド携帯電話で奇妙な問題が発生します。intを使用するといくつかのアンドロイド携帯電話で間違った答えが出る可能性があります

public void test(){ 
    int num = 1; 
    for(int i=0;i<14;i++){ 
     num = num+100000; 
    } 
    System.out.println("num "+num); 
} 

私は答え、「1400001」を期待するが、私はモトクロス2ndGen、Xiaomi3のような携帯電話上で間違った答え「200385」を取得し、小米科技注意など

奇妙なことは、私が得ることができるということです私はそれをデバッグ、または

public void test(){ 
     int num = 1; 
     for(int i=0;i<14;i++){ 
      num = num+100000; 
      System.out.println("num "+num); 
     } 
    } 

または

public void test(){ 
     int num1 = 1; 
     for(int i=0;i<14;i++){ 
      num1 = num1+100000; 
     } 
     System.out.println("num1 "+num1); 
     int num2 = 1; 
     for(int i=0;i<14;i++){ 
      num2 = num2+100000; 
     } 
     System.out.println("num2 "+num2); 
    } 

のようなコードを複雑にしたい正解intlongに設定するか、「100000」を100にすると、通常は正しい回答が得られます。では、この現象の背景にある理由は何ですか?整数オーバフロー? 補足: 間違った電話機のサイズを調べると32で、最大値は2147483647で、他のものと同じです。結果の1つが "131072"でオーバーフローし、バイナリが2^17です。間違った結果が4回目、8回目などの "for"コードで4倍になります。なぜですか?

+0

intの代わりにlongデータ型を使用し、num変数を試す – siddhesh

+0

longデータ型を使用するのが正しいです。私は整数についての理由を知りたい。 –

+0

チェック・サイズ(バイト単位) – siddhesh

答えて

0

Integer.MAX_VALUEInteger.SIZEを印刷してみてください。これは常に2147483647(最大)と32(ビット単位)にする必要があります。

forループの内側か外側に印刷しますか?内部にある場合は、forループの後にSystem.out.flush()を使用してみてください。

+0

私は間違った携帯電話のintサイズをテストする32、最大値は2147483647、others.And結果の1つが "131072"でオーバーフローし、バイナリを2^17に変更することがわかりました。 4回目、8回目などの "for"コードで4倍の時間に発生します。なぜですか? –

関連する問題