85.10 10진수를 16진수로 변환하기

sprintf를 사용하지 않고 10진수를 16진수로 된 문자열로 변환하는 방법입니다. 10진수를 16진수로 변환하는 방법은 10진수를 2진수로 변환하는 방법과 큰 틀이 같습니다. 16으로 나누었을 때 나머지를 구해서 10보다 작으면 0~9까지의 값이고 10보다 크면 A~F까지의 값입니다.

그림 85-1 10진수를 16진수로 된 문자열로 변환

dec_to_hex_string.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
    int decimal = 300;                // 10진수 300
    char hexadecimal[20] = { 0, };    // 16진수로 된 문자열을 저장할 배열
    
    int position = 0;
    while (1)
    {
        int mod = decimal % 16;    // 16으로 나누었을 때 나머지를 구함
        if (mod < 10) // 나머지가 10보다 작으면
        {
            // 숫자 0의 ASCII 코드 값 48 + 나머지
            hexadecimal[position] = 48 + mod;
        }
        else    // 나머지가 10보다 크거나 같으면
        {
            // 나머지에서 10을 뺀 값과 영문 대문자 A의 ASCII 코드 값 65를 더함
            hexadecimal[position] = 65 + (mod - 10);
        }

        decimal = decimal / 16;    // 16으로 나눈 몫을 저장

        position++;    // 자릿수 변경

        if (decimal == 0)    // 몫이 0이되면 반복을 끝냄
            break;
    }

    // 배열의 요소를 역순으로 출력
    for (int i = position - 1; i >= 0; i--)
    {
        printf("%c", hexadecimal[i]);
    }

    printf("\n");

    return 0;
}

실행 결과

12C

10진수를 16으로 나누었을 때 나머지를 구해서 10보다 작으면 배열에 0~9까지의 문자를 넣어주고, 10보다 크거나 같으면 배열에 A~F까지의 문자를 넣어주면 됩니다. 즉, 0~9는 숫자 0의 ASCII 코드 값 48을 더해주고, A~F는 영문 대문자 A의 ASCII 코드 값 65를 더해주면 됩니다(소문자로 출력하고 싶다면 97을 더함). 단, 10보다 크거나 같을 때는 10을 빼서 0, 1, 2, 3, 4, 5를 A, B, C, D, E, F에 일치시킵니다.

아래 자리부터 변환했으므로 출력할 때는 역순으로 출력합니다.