문제 상황
C 프로그래밍 언어를 사용해 16진수(hexadecimal) 값을 정수(10진수) 값으로 변환하려면 어떻게 해야 할까요?
이 글에서는 16진수의 기본 개념부터 시작해, 함수를 직접 작성하여 변환하는 방법과 그 동작 원리를 단계별로 살펴보겠습니다.
16진수란 무엇인가?
16진수는 총 16개의 기호, 즉 숫자 0~9와 영문자 A~F를 사용해 값을 표현하는 진법입니다. 이때 A부터 F까지는 각각 10진수의 10부터 15에 대응됩니다.
예를 들어 16진수 A는 10진수 10을, F는 15를 의미합니다.
16진수 → 정수 변환 예제 코드
다음은 사용자로부터 16진수 문자열을 입력받아, 별도의 함수를 통해 정수 값으로 변환하는 C 프로그램입니다.
#include <stdio.h>
#include <string.h>
#include <math.h>
int hextodc(char *hex) {
int y = 0;
int dec = 0;
int x, i;
/* 16진수 문자열을 오른쪽에서 왼쪽으로 한 글자씩 검사 */
for(i = strlen(hex) - 1; i >= 0; --i) {
if(hex[i] >= '0' && hex[i] <= '9') {
x = hex[i] - '0'; /* '0'~'9' → 0~9 */
} else {
x = hex[i] - 'A' + 10; /* 'A'~'F' → 10~15 */
}
dec = dec + x * pow(16, y); /* 자릿값을 곱해 누적 */
y++;
}
return dec;
}
int main() {
char hex[100];
printf("Enter Hexadecimal: ");
scanf("%s", hex);
printf("\nDecimal: %d", hextodc(hex));
return 0;
}
실행 결과
위 프로그램을 컴파일하여 실행하면 다음과 같은 결과를 확인할 수 있습니다.
1. Enter Hexadecimal: A
Decimal: 10
2. Enter Hexadecimal: A12
Decimal: 2578
코드 동작 원리
- 오른쪽에서 왼쪽으로 스캔: 16진수 문자열의 모든 문자를 맨 뒤에서부터 앞으로 한 글자씩 읽습니다.
- 문자 → 숫자 변환: 현재 스캔한 문자를 A라고 가정했을 때, 이를 해당하는 10진수 값으로 바꾸어 변수
x에 저장합니다. - 자릿값 계산: 공식
dec = dec + x × 16^y를 이용해 자릿값만큼 곱한 결과를 누적합니다. - 지수 증가: 한 글자를 처리할 때마다
y = y + 1로 지수를 증가시킵니다. - 결과 반환: 모든 문자를 처리한 후 최종 10진수 값
dec를 반환합니다.
참고로 왼쪽에서 오른쪽으로 스캔하는 방식도 가능합니다. 단, 이 경우에는 y를 N − 1(N은 16진수의 길이)로 초기화한 뒤, 매 반복마다 1씩 감소시켜야 합니다.
표준 라이브러리 활용 팁
직접 함수를 구현하지 않더라도, C 표준 라이브러리의 strtol() 함수나 sscanf()의 %x 서식 지정자를 사용하면 손쉽게 16진수를 정수로 변환할 수 있습니다.
#include <stdio.h>
int main() {
int value;
sscanf("A12", "%x", &value);
printf("Decimal: %d\n", value); /* 출력 결과: Decimal: 2578 */
return 0;
}