[C] 기수법

1 minute read

C언어에서 사용하는 대표적인 Data type을 소개하기 이전에 살펴볼 것은 기수법이다. 기수법은 수를 표현하는 방법으로 사람이 일반적으로 실생활속에서 사용하는 10진수외에도 2진수, 8진수, 16진수 등이 있다. 2진수은 0과 1만을 사용하여 수를 표현하는 기수법이다. 10진수 숫자를 2진수으로 표현하면 15의 경우 1111(2), 8의 경우 100(2)와 같이 표현된다. 2진수을 활용하면 모든 숫자를 0과 1로 표현할 수 있다는 점이 컴퓨터의 작동원리와 맞닿아 있기 때문에 조금 더 살펴 볼 필요가 있다.
컴퓨터의 CPU(Central Processing Unit)는 수 많은 트랜지스터로 이루어진 집적회로이고, 트랜지스터 이전의 컴퓨터인 진공관은 0과 1을 사용하여 전기가 흐르고, 흐르지 않고를 표현했다. 즉 컴퓨터의 HW(Hard ward)의 상태(전류 On/Off)가 이원화된 신호로 표현가능 하다는 점에 주목하면 기계어가 0과 1로만 이루어진 이유를 짐작할 수 있다.
임의의 데이터를 0과 1로 표현하려면 그에 따른 용량이 필요한데 그 단위를 bit라고 하며 0과 1을 표현가능한 자리수라고 생각하면 쉽다. 하나의 단위를 bit, 4개 단위를 1 nibble, 8개 단위를 1 byte 혹은 1 B 라고 한다 (8 bit = 1 byte = 1 B). 예를 들어 1 B = 1 bit = ㅁㅁㅁㅁㅁㅁㅁㅁ 이고 00000000 에 아라비아 숫자 0을 의미하도록 설정하면, 11111111 은 255를 의미한다. 즉 2^8개의 상태를 표현할 수 있다.

Visual stdio와 같은 IDE(Integrated Development Environment)를 통해 디버깅을 수행하다보면, 데이터 저장된 주소가 16진수으로 나타난 경우가 있다. 이는 컴퓨터에서 모든 것을 2진수으로 표현하자니 표현 길이가 너무 길어 이를 4 bit 씩 묶어서 16진수으로 짧게 표현하기 때문이다. 16진수의 경우 0~15까지의 수가 하나의 수로 표현되는데 0~9까지는 그대로 사용하고 10~15까지를 A에서 F까지의 문자로 대치하여 사용한다. 컴퓨터에서는 16진수을 10진수 수 표현을 위해 사용하는 것이 아니라, 2진수 표현을 위해 사용하기 때문에 2진수 4자리를 1자리의 16진수 표현으로 대응시킨다. 예를들어 ㅁㅁㅁㅁㅁㅁㅁㅁ 2진수 수 8자리는 표현 가능한 상태범위가 16개(0~15)가 되는 4자리씩 끊어서 각각 한자리의 16진수 수로 대응된다 ( 11111111(2) -> FF(16) ). 16진수을 사용할 경우 이를 10진수, 2진수 표현과 분별하기 위해 숫자 앞에 ‘0x’라는 표기를 병행하기도 한다.
8진수을 사용하는 경우에는 3bit를 묶어서 0에서 7까지에 해당하는 상태를 한 자리에 대응한다 ( 100(2) -> 10(8) ). 8진수 표현은 0이라는 지시자를 붙여 010 과 같이 표현하기도 한다. printf 함수는 이런 다양한 기수법에 대해 서식 지정자를 활용해 표현 가능하게 했다. 각각의 기수법에 대응되는 서식 지정자는 아래 표와 같다.

Syntax 의미
%d 10진수
%x 16진수
%#x 16진수 + 기수법
%o 8진수
%#o 8진수 + 기수법
    #include <stdio.h>

    int main(void){
        int i=427;

        printf("%d\n", i);
        printf("%x\n", i);
        printf("%X\n", i);
        printf("%#x\n", i);
        printf("%#X\n", i);
        printf("%o\n", i); 
        printf("%#o\n", i);

        return 0;
    }   
427
1ab
1AB
0x1ab
0X1AB
653
0653