C & C++/디딤돌 C언어

Part 3. 형식과 메모리 크기, 진수 표현

언휴 2024. 1. 9. 08:48

Part 3. 형식과 메모리 크기, 진수 표현

 

[디딤돌 C언어]  Part 3. 형식과 메모리 크기, 진수 표현

9. 기본 형식(TYPE)

프로그래밍 언어에서는 데이터를 표현하는 문법으로 형식과 변수를 제공해요.

형식은 데이터의 종류와 표현 범위에 따라 메모리 크기와 범위를 약속하고 있어요.
실제 메모리가 필요할 때 형식을 지정하여 변수를 선언하면 약속한 메모리를 할당받아 사용할 수 있어요.

 

C 언에에서 제공하는 형식에는 문자, 정수, 실수를 표현할 때 사용하는 기본 형식이 있어요.
그리고 여러개의 원소를 연속적인 메모리에 할당받아 사용하는 배열과 프로그램의 메모리 주소를 기억하는 포인터도 있죠.

이 외에 개발자가 프로그램에 필요한 형식을 정의하는 문법을 제공합니다.

개발자가 정의하여 사용하는 형식을 사용자 정의 형식이라고 부르며 구조체, 공용체, 열거형이 있어요.

다양한 형식
다양한 형식

 

컴퓨터에 데이터를 저장하는 장치인 메모리의 양은 유한한 자원이죠.
이러한 이유로 정수를 표현하기 위한 형식도 특정 범위에서 표현할 수 있어요.


C언어에서는 표현 범위에 따라 다양한 정수 형식을 제공합니다.
특히 문자 형식은 표현 범위가 작은 정수 형식으로 취급하고 있어요.

그리고 실수는 오차 범위를 갖는 근사치 표현이예요.

 

10.정수 형식과 표현 범위

C언어에서는 표현할 수 있는 범위에 따라 여러 종류의 정수 형식을 지원합니다.

1바이트에서 8바이트까지 다양한 종류의 정수 형식을 지원하죠.


다음은 다양한 정수 형식의 메모리 크기를 확인하는 예제입니다.
sizeof를 사용하면 메모리 크기를 알 수 있어요.
그리고 printf 문의 첫 번째 인자 문자열에 %d를 사용하면 10진수로 출력합니다.

C언어 형식과 메모리 크기 및 표현 범위
C언어 형식과 메모리 크기 및 표현 범위

#include <stdio.h>
int main()
{
    printf("정수 형식의 크기 확인\n");
    printf("char : %d \n", sizeof(char));
    printf("unsigned char : %d \n", sizeof(unsigned char));
    printf("short : %d \n", sizeof(short));
    printf("unsigned : %d \n", sizeof(unsigned short));
    printf("int : %d \n", sizeof(int));
    printf("unsigned int : %d \n", sizeof(unsigned int));
    printf("long : %d \n", sizeof(long));
    printf("unsigned long : %d \n", sizeof(unsigned long));
    printf("long long : %d \n", sizeof(long long));
    printf("double long : %d \n", sizeof(double long));
    return 0;
}

◈ 실행 결과

정수 형식의 크기 확인
char : 1
unsigned char : 1
short : 2
unsigned : 2
int : 4
unsigned int : 4
long : 4
unsigned long : 4
long long : 8
double long : 8

 

11.메모리, 10진수, 2진수, 16진수

2024년 3월 전후로 새롭게 동영상 강의를 업로드할 예정입니다.

메모리 최소 단위는 1비트로 0과 1을 표현할 수 있어요.

프로그램에서 할당하는 최소 메모리 단위는 1바이트(8비트)입니다.

 

C언어에서 char 형식이 1바이트입니다.

그리고 1바이트로 표현할 수 있는 가지 수는 2의 8승으로 256가지입니다.

 

메모리에 있는 값을 표현할 때 10진수는 불편할 수 있어요.

예를 들어 2바이트 메모리에 500이 있을 때 첫 번째 바이트에 있는 값과 두 번째 바이트에 있는 값을 표현하는 것은 불편합니다.

 

10진수 500은 2진수로 표현하면 111110100(2) 입니다.

따라서 첫 번째 바이트에는 1(2) 이고 두 번째 바이트에는 1111 0100(2)이 들어있습니다.

 

10진수 500은 8진수로 표현하면 764(8)입니다.

8진수 764(8)은 이진수로 표현하면 111 110 100(2)입니다.

따라서 첫 번째 바이트에는 1(2)이고 두 번째 바이트에는 11110100(8)이 들어 있습니다.

8진수를 2진수로 변환하는 것은 쉽지만 여전히 메모리에 있는 값을 표현하는 것은 불편하네요.

 

10진수 500은 16진수로 표현하면 1F4(16)입니다.

따라서 첫 번째 바이트는 1(16)이고 두 번째 바이트에는 F4(16)이 들어있습니다.

16진수는 메모리에 있는 값을 보다 편하게 표현할 수 있네요.

 

이러한 이유로 프로그램에서 16진수 표현은 자주 사용합니다.

 

C언어에서 8진수는 수 앞에 0(영)을 붙여 표현합니다.

0764는 8진수 764(8)을 의미하며 10진수 500과 같은 값입니다.

 

C언어에서 16진수는 수 앞에 0x(영엑스)를 붙여 표현합니다.

0x1F4는 16진수 1F4(16)을 의미하며 10진수 500과 같은 값입니다.

 

참고로 printf 함수에서 10진수로 값을 출력할 때 포멧은 %d이며 8진수는 %o(영어 오), 16진수는 %x 혹은 %X입니다.

printf 함수에서 %#x 처럼 #을 붙이면 진수 표현도 같이 출력합니다.

 

#include <stdio.h>

int main()
{	
	printf("%d %d %d\n", 500, 0764, 0x1F4);
	printf("%d %o %X\n", 500, 500, 500);
	printf("%#d %#o %#X\n", 500, 500, 500);
	return 0;
}

 

 

실행 결과

500 500 500
500 764 1F4
500 0764 0X1F4

 

1. 2진수 01010010은 10진수로 얼마인지 계산하시오.

더보기

답:  0*128+1*64+0*32+1*16+0*8+0*41*2+0*0 = 82

 

2. 2진수 01010010은 16진수로 얼마인지 계산하시오.

더보기

답: 0101(2진수) =5(16진수) , 0010(2진수)=>2(16진수)  따라서 이진수 01010010는 16진수로 0x52

 

3. 16진수 0x52는 10진수로 얼마인지 계산하시오.

더보기

답: 5*16 + 2*1 = 82

 

4. 10진수 37을 이진수로 얼마인지 계산하시오.

더보기

답: 37 = 32 + 4 + 1 = 100101(이진수)

 

5. 16진수 0x25를 이진수로 얼마인지 계산하시오.

더보기

답: 2(16진수) = 0010(이진수), 5(16진수) = 0101(2진수) 따라서 16진수 0x25는 이진수 00100101

 

6. 10비트로 표현할 수 있는 데이터 가지수는?

더보기

답: 2의 10승

 

7. 4바이트 메모리의 데이터를 2진수로 나타내기 위해 필요한 자리수는?

더보기

답: 1비트에 1자리이므로 32 비트/1 = 32, 따라서 32자리

 

8. 4바이트 메모리의 데이터를 16진수로 나타내기 위해 필요한 자리수는?

더보기

답: 4비트에 1자리이므로 32비트 / 4 = 8 , 따라서 8자리