2011-02-23 3 views
2

이 코드는 16 진수를 10 진수로 변환합니다.이 코드가 16 진수를 10 진수로 변환하는 이유

int value; 
// ch is a char variable holding a hexadecimal digit 
if (isxdigit(ch)) 
    if (isdigit(ch)) 
     value = ch - '0'; 
    else 
     value = tolower(ch) - 'a' + 10; 
else 
    fprintf(stderr, "%c is not a valid hex digit", ch); 

어떻게 작동하는지 완전히 이해하지 못합니다. 숫자가 문자인지 문자인지에 따라 char 변수에서 다른 것들을 뺀 것을 볼 수 있습니다. 숫자가 변환되는 부분을 이해할 수 있지만 문자가 문자 인 경우 10을 값에 추가해야하는 이유를 알지 못합니다.

답변

11

tolower(ch) - 'a'의 뺄셈은 문자 a..f에 대해 0..5 범위의 숫자로 문자를 매핑합니다. 그러나 16 진수 숫자 의 (십진수) 값은 10 이므로 다시 10.15까지 범위를 이동하려면 10이 추가됩니다.

는 아마도이 도움이 :은 "결과 값"열이 마지막 "숫자 값"열에 따라 할 필요가있는하지 않은, 'A'에서 다시 0으로 다시 설정하는 방법

+---------+------------+-----------------+-------------+ 
Character | Subtracted | Resulting value | Digit value | 
+---------+------------+-----------------+-------------+ 
| '0' |  '0' |  0   |  0  | 
| '1' |  '0' |  1   |  1  | 
| '2' |  '0' |  2   |  2  | 
| '3' |  '0' |  3   |  3  | 
| '4' |  '0' |  4   |  4  | 
| '5' |  '0' |  5   |  5  | 
| '6' |  '0' |  6   |  6  | 
| '7' |  '0' |  7   |  7  | 
| '8' |  '0' |  8   |  8  | 
| '9' |  '0' |  9   |  9  | 
| 'a' |  'a' |  0   |  10  | 
| 'b' |  'a' |  1   |  11  | 
| 'c' |  'a' |  2   |  12  | 
| 'd' |  'a' |  3   |  13  | 
| 'e' |  'a' |  4   |  14  | 
| 'f' |  'a' |  5   |  15  | 
+---------+------------+-----------------+-------------+ 

공지 사항, 십진법으로 각 16 진수의 값을 보여줍니다.

1

표현식 ch - '0'은 C에서 "0 ... 이후 각 문자의 값은 이전 값보다 커야합니다"(C99 섹션 5.2.1) 때문에 작동합니다.

따라서, 예를 들어, 문자 '3'의 값은 '0'의 값보다 3 큰, 그래서 당신은이 두 값을 뺄 때, 당신은 때문에 운에 의해 정수 3.

표현을 tolower(ch) - 'a' + 10 작품을 얻을 , 위의 제약 조건을 제외한 숫자의 모든 값은 구현에 따라 정의됩니다.

'c' - 'a'을 뺄 때 대부분의 컴퓨터가 ASCII 또는 EBCDIC에서 작동하기 때문에 2가됩니다 (10을 더하면 12가됩니다). 그러나이 프로그램을 DS9K에서 실행하면 -42가 발생할 수 있습니다.

실제로 휴대 할 수 있으려면 ch과 6 개의 문자를 차례로 비교해야합니다. 그래서 일부 시스템에서는 digittoint() 기능을 제공합니다.

관련 문제