정수 표현 및 출력 (10진수, 8진수, 16진수) [언제나 C언어]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의에서는 정수 표현과 출력을 알아봅시다.

== 다루는 내용
1. 정수 표현(10진수, 8진수, 16진수)
2. 정수 출력 (10진수, 8진수, 16진수)
3. 왜 8진수와 16진수 표현과 출력을 제공할까?

1. 정수 표현(10진수, 8진수, 16진수)

C언어에서 일반적인 수 표현은 당연히 10진수입니다.

8진수를 표현하려면 표현 앞에 숫자 0을 추가하세요.

16진수를 표현하려면 표현 앞에 숫자 0과 알파벳 x를 추가하세요.

#include //표준 라이브러리 헤더 파일
#include  //표준 입출력 헤더 파일

int main()//프로그램 진입점
{   
    //10진수 출력
    printf("%d\n", 10);
    printf("%d\n", 010);//8진수 10(8진수) = 8+0 = 8
    printf("%d\n", 0x10);//16진수 10(16진수)16+0 = 16
    system("pause");
    return 0;
}

2. 정수 출력 (10진수, 8진수, 16진수)

이전 강의에서 라인 출력할 때 puts 함수를 사용했었죠.

그리고 개발자가 원하는 포멧에 맞게 출력하는 printf도 사용했어요.

이미 printf 포멧을 확인하신 분들도 계실거예요.

printf 함수 및 포멧 확인하기

정수를 출력할 때 %포멧 사양자 뒤에 d를 나타냈었죠.

8진수로 출력할 때는 % 뒤에 알파벳 o를 붙입니다.

16진수로 출력할 때는 % 뒤에 x를 붙입니다.

#include //표준 라이브러리 헤더 파일
#include  //표준 입출력 헤더 파일

int main()//프로그램 진입점
{   
    //16진수 0x12345678
    //0001 0010 0011 0100 0101 0110 0111 1000

    //10진수 출력
    printf("%d\n", 10);
    printf("%d\n", 010);//8진수 10(8진수) = 8+0 = 8
    printf("%d\n", 0x10);//16진수 10(16진수)16+0 = 16

    //8진수 출력
    printf("%#o\n", 10);//8+2 =>12(8진수)
    printf("%#o\n", 010);//10
    printf("%#o\n", 0x10);//16진수 10(16진수)16+0 = 16 =>20(8진수)

    return 0;
}

출력한 값이 8진수인지 16진수인지 알 수 있게 출력할 수도 있어요.

이 때는 %와 o(혹은 x) 사이에 #을 붙이세요.

#include //표준 라이브러리 헤더 파일
#include  //표준 입출력 헤더 파일

int main()//프로그램 진입점
{   
    //16진수 0x12345678
    //0001 0010 0011 0100 0101 0110 0111 1000

    //10진수 출력
    printf("%d\n", 10);
    printf("%d\n", 010);//8진수 10(8진수) = 8+0 = 8
    printf("%d\n", 0x10);//16진수 10(16진수)16+0 = 16

    //8진수 출력
    printf("%#o\n", 10);//8+2 =>12(8진수)
    printf("%#o\n", 010);//10
    printf("%#o\n", 0x10);//16진수 10(16진수)16+0 = 16 =>20(8진수)


    //16진수 출력
    printf("%#x\n", 10); //a
    printf("%#x\n", 010);//8 
    printf("%#x\n", 0x10);//10
    system("pause");
    return 0;
}

3. 왜 8진수와 16진수 표현과 출력을 제공할까?

C언어는 Unix System에서 동작 가능한 프로그램 제작을 위해 만들어진 언어예요.

시스템 프로그래밍에서는 비트 단위의 연산이나 기법이 일반 응용에 비해 많아요.

그리고 당시 메모리도 귀했던 시절이구요.

이러 저러한 이유로 프로그램 데이터를 메모리에 표현하거나 메모리에 있는 데이터가 얼마인지 쉽게 확인할 수 있게 한 것이죠.

예를 들어, 10진수 12345678을 메모리에 어떻게 저장하는지 그려보라고 하면 딱 싫을거예요.

16진수 0x12345678을 메모리에 어떻게 저장하는지 그려보라고 하더라도 딱 싫으면 안 되는데…

16진수 한 자리는 2비트 4자리를 차지합니다.

따라서 16진수 0x12345678은 0001 0010 0011 0100 0101 0110 0111 1000 형태로 메모리에 들어갑니다.

이처럼 16진수 특정 값을 메모리에 쉽게 표현할 수 있어요.

반대로 메모리에 있는 값을 16진수로 표현하는 것도 어렵지 않습니다.

암튼 간단하지만 수학은 여기까지…