2016-10-21 7 views
2

В источнике jdk у меня есть некоторые вопросы об алгоритме parseInt (String str, int radix) Integer. Посмотрите источник кода ниже.Почему алгоритм 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

Вы видите строку 'return negative? результат: -result; 'около двух строк ниже фрагмента, который вы цитировали? –

+4

Вы видели, как комментарий «накапливается отрицательно, избегает сюрпризов возле MAX_VALUE»? – EJP

+0

поэтому, когда число отрицательно, limit varayable является Integer.MIN_VALUE, а число положительным, предел varayable -Integer.MAX_VALUE, почему? Я тоже смущен. не могли бы вы указать алгоритм или ссылки на некоторые статьи? –

ответ

4

Код имеет комментарий: «Накопительные отрицательно избегают сюрпризов возле MAX_VALUE»

В числе анализируется код добавляет цифру к аккумулятору переменной result.

Теперь автор хотел написать код для создания номера в аккумуляторе только один раз для положительных и отрицательных чисел.

Затем, когда это будет сделано, он добавит к нему знак; если перед номером был минус, результат будет отрицательным, в противном случае положительным.

Проблема в том, что диапазон чисел для целых чисел не является симметричным для положительных и отрицательных чисел. Наименьшее отрицательное число, которое вписывается в int является -2147483648, но наибольшее положительное число, если 2147483647.

Если число в локальной переменной result хранилась положительным, это не было бы возможным разобрать отрицательное число -2147483648.

Вот почему код сохраняет отрицательный до конца - потому что диапазон отрицательных чисел достаточно велик, чтобы удерживать все положительные числа, а диапазон положительных чисел - одно число слишком мало, чтобы удерживать все отрицательные числа.

 Смежные вопросы

  • Нет связанных вопросов^_^