728x90

8진수와 16진수

일반적으로, C 언어는 정수형을 10진수 형태로 작성할 것으로 생각합니다. 하지만 많은 프로그래머는 8진수(기수 8)와 16진수(기수 16)로 작성하기를 원합니다. 8진수와 16진수는 2의 거듭제곱이라서 컴퓨터와 관련된 값들을 표현하는 것이 10진수보다 편리합니다. 예를 들면, 16비트 컴퓨터에서 자주 등장하는 수인 65536을 16진수로 나타내면 10000이 됩니다.

16진수는 숫자를 4비트 단위로 끊어서 인식합니다. 예를 들면, 16진수 숫자 3은 0011이고, 16진수 숫자 5는 0101입니다. 그래서 16진수 값 35는 비트 패턴이 0011 0101이고, 16진수 값 53은 0101 0011이 됩니다. 이처럼 인식하는 것이 16진수와 2진수(기수 2)를 전환하는 것을 더욱 쉽게 만듭니다.

그런데 10000이라고 적었을 때 이것이 10진수, 8진수, 16진수 중 어떤 형태의 값인지 컴퓨터가 어떻게 알 수 있을까요? C에서는 특별한 접두사(prefix)를 이용해서 사용자가 어느 형태로 작성한 것인지 알려줍니다. 접두사 0x0X(zero-ex)는 16진수의 값을 지정하는 데 사용됩니다. 예를 들어, 10진수 16을 16진수로 나타내면 0x10 또는 0X10이 됩니다. 이와 비슷하게, 접두사 0(zero)은 8진수 값을 지정하는 데 사용됩니다. 그래서 10진수 16을 8진수로 나타내면 020이 됩니다. 이들의 수 체계에 대해서는 '비트 조작'을 배울 때 좀 더 자세하게 설명하겠습니다.

이처럼 서로 다른 수의 체계를 사용할 수 있게 허용한 것은 사용자를 위해 만들어진 서비스입니다. 이것은 수가 저장되는 방식에 영향을 주지 않습니다. 즉, 16, 020, 0x10 어떤 것을 사용하더라도 컴퓨터는 내부에서 사용하는 2진수 코드로 저장합니다.


8진수와 16진수를 출력하는 방법
C에서 세 가지 수 체계 중 하나로 저장할 수 있듯이, 세 가지 수 체계 중 어느 하나로 출력할 수도 있습니다. 8진수 표기로 정수를 출력하려면 %d 대신에 %o를 사용하면 됩니다. 16진수 표기로 출력하려면 %x를 사용하면 됩니다. 접두사도 함께 출력하기 위해서는 %#o, %#x, %#X 지정자를 사용하면 됩니다. 이들은 각각 0, 0x, 0X 접두사를 수와 함께 출력합니다. 예제 3.3은 간단한 예를 보여줍니다. (일부 IDE에서는 프로그램 실행 창이 즉시 닫히지 않도록 코드 안에 getchar();문을 추가해줘야 할 수도 있습니다.)

예제 3.3 - print.c 프로그램

/* print.c -- 1000을 10진수, 8진수, 16진수 표기로 출력합니다. */
#include <stdio.h>

int main(void) {
    printf("10진수 = %d, 8진수 = %o, 16진수 = %x \n"
, 100, 100, 100);
    printf("10진수 = %d, 8진수 = %#o, 16진수 = %#x \n", 100, 100, 100);

    return 0;
}

이 프로그램을 컴파일하고 실행하면 다음과 같이 출력됩니다.

10진수 = 100, 8진수 = 144, 16진수 = 64
10진수 = 100, 8진수 = 0144, 16진수 = 0x64

같은 값이 세 가지 서로 다른 수의 체계로 출력된 것을 알 수 있습니다. printf() 함수는 이러한 변환을 처리합니다. 또한, 포맷 지정자의 일부로 #을 넣지 않으면 접두사 00x가 표시되지 않는다는 점을 주의해야 합니다.

728x90
728x90