2016-10-21 2 views
2

jdk 소스에서 정수의 parseInt (String str, int radix) 알고리즘에 대한 몇 가지 질문이 있습니다. 아래 코드 소스를 참조하십시오.왜 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;'인용 한 스 니펫 아래 두 줄 정도? –

+4

'누적 적으로 누적되면 MAX_VALUE 부근에서 놀라움을 피할 수 있으십니까?' – EJP

+0

그래서 num이 음수 일 때, limitable은 Integer.MIN_VALUE이고 num은 양수이고, varaiable은 -Integer.MAX_VALUE입니다. 왜? 혼란 스럽습니다. 알고리즘 또는 일부 기사의 링크를 지정할 수 있습니까? –

답변

4

코드는 주석이 있습니다 수가 구문 분석으로

"부정적으로 축적하는 MAX_VALUE에 가까운 놀라움을 방지"를, 코드 result 변수 축적에 숫자를 추가합니다.

이제는 양수와 음수 모두에 대해 누적 기의 숫자를 한 번만 작성하는 코드를 작성하려고했습니다.

그러면 완료되면 기호가 추가됩니다. 숫자 앞에 마이너스 문자가 있으면 결과는 음수가되고 그렇지 않으면 양수가됩니다.

정수의 숫자 범위는 양수와 음수에 대해 대칭이 아닙니다. int에 맞는 작은 음수 -2147483648하지만 result 로컬 변수의 수가 포지티브 유지하면 큰 양수 2147483647

경우, 음수 -2147483648를 파싱 할 수 없을 것이다.

음수의 범위가 모든 양수를 포함 할만큼 충분히 크고 양수의 범위가 모든 음수를 포함하기에는 너무 작은 하나의 숫자이기 때문에 코드는 마지막까지 음수를 유지합니다.