2016-10-21 1 views
2

jdkソースでは、IntegerのparseInt(String str、int radix)algorithm.letの以下のコードソースを参照してください。Integer.paseInt()アルゴリズムが最終的にsunで負の結果を計算する理由jdk

 multmin = limit/radix; 
     while (i < len) { 
      // Accumulating negatively avoids surprises near MAX_VALUE 
      digit = Character.digit(s.charAt(i++),radix); 
      if (digit < 0) { 
       throw NumberFormatException.forInputString(s); 
      } 
      if (result < multmin) { 
       throw NumberFormatException.forInputString(s); 
      } 
      result *= radix; 
      if (result < limit + digit) { 
       throw NumberFormatException.forInputString(s); 
      } 
      result -= digit; 
     } 

それは結果である理由 - =桁ではなく、その結果+ =桁?私は混乱しています。

+0

「返品が拒否されましたか?結果:-result; 'あなたが引用したスニペットの約2行下にありますか? –

+4

「MAX_VALUE近くで累積的に負の驚きを回避する」というコメントがありましたか? – EJP

+0

numが負であるとき、limitableはInteger.MIN_VALUEであり、numは正であり、varaiableの上限は-Integer.MAX_VALUEです。なぜですか?私も混乱します。あなたはアルゴリズムかいくつかの記事のリンクを指定できますか? –

答えて

4

コードコメントがあります数が解析されるよう

「負に蓄積するMAX_VALUE近く驚きを回避する」、コードがresult変数アキュムレータに番号を追加します。

今、著者は、正と負の両方の数値に対してアキュムレータの数値を1回作成するコードを記述したかったのです。

これが終了すると、それに符号が追加されます。数字の前にマイナス文字がある場合、結果は否定、そうでなければ正になります。

整数の数値範囲が正と負の数値で対称ではないという問題があります。 intに収まる最小の負の数は-2147483648ですがresultローカル変数の数値が正維持した場合に最大の正の数は2147483647

場合、負の数-2147483648を解析することはできません。

これは、負の数の範囲がすべての正の数を保持するのに十分な大きさであり、正の数の範囲がすべての負の数を保持するには小さすぎるためです。

関連する問題