Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 16진수를 정수(10진수) 값으로 변환하는 방법

문제 상황

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

코드 동작 원리

  1. 오른쪽에서 왼쪽으로 스캔: 16진수 문자열의 모든 문자를 맨 뒤에서부터 앞으로 한 글자씩 읽습니다.
  2. 문자 → 숫자 변환: 현재 스캔한 문자를 A라고 가정했을 때, 이를 해당하는 10진수 값으로 바꾸어 변수 x에 저장합니다.
  3. 자릿값 계산: 공식 dec = dec + x × 16^y를 이용해 자릿값만큼 곱한 결과를 누적합니다.
  4. 지수 증가: 한 글자를 처리할 때마다 y = y + 1로 지수를 증가시킵니다.
  5. 결과 반환: 모든 문자를 처리한 후 최종 10진수 값 dec를 반환합니다.

참고로 왼쪽에서 오른쪽으로 스캔하는 방식도 가능합니다. 단, 이 경우에는 yN − 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;
}