..

Search

9) 기본 타입

9) 기본 타입

기본 타입


기본 타입

C언어에서 타입(data type)이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 합니다.

따라서 C언어는 여러 형태의 타입을 미리 작성하여 제공하고 있는데, 이것을 기본 타입이라고 합니다.

이러한 기본 타입은 크게 정수형, 실수형, 그리고 문자형 타입으로 나눌 수 있습니다.


정수형 타입

C언어에서 정수란 부호를 가지고 있고, 소수 부분이 없는 수를 의미합니다.

 

정수형 데이터에 unsigned 키워드를 추가하면, 부호를 나타내는 최상위 비트(MSB, Most Significant Bit)까지도 크기를 나타내는 데 사용할 수 있습니다.

이러한 unsigned 정수는 음수를 표현할 수는 없게 되지만, 0을 포함한 양의 정수는 두 배 더 많이 표현할 수 있게 됩니다.

음의 정수까지도 표현할 수 있는 signed 키워드는 모든 타입에서 기본적으로 생략하여 사용할 수 있습니다.

 

최상위 비트(MSB, Most Significant Bit)란 1바이트를 구성하는 8개의 비트 중 최고값을 갖는 비트를 의미합니다.

 

다음 표는 각각의 정수 타입에 따른 메모리의 크기 및 데이터의 표현 범위를 나타냅니다.

정수형 타입 할당되는 메모리의 크기 데이터의 표현 범위
(signed) short

2 바이트

- 32,768 ~ 32,767

unsigned short 2 바이트 - 0 ~ 65,535
(signed) int

4 바이트

- 2,147,483,648 ~ 2,147,483,647

unsigned int 4 바이트 - 0 ~ 4,294,967,296
(signed) long 4 바이트 - 2,147,483,648 ~ 2,147,483,647
unsigned long 4 바이트 - 0 ~ 4,294,967,296

 

정수형 데이터의 타입을 결정할 때에는 반드시 자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 합니다.

해당 타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면, 오버플로우가 발생해 전혀 다른 값이 저장될 수 있기 때문입니다.

 

오버플로우(overflow)란 해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상을 가리킵니다.

오버플로우가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 인접 비트를 덮어쓰므로, 잘못된 결과를 얻을 수 있습니다.

또한, 언더플로우(underflow)란 해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상을 가리킵니다.

 

다음 예제는 int형 변수에 해당 타입이 저장할 수 있는 최댓값과 그 최댓값을 넘는 숫자를 대입하는 예제입니다.

예제

int num = 2147483647; // int형 타입이 저장할 수 있는 최댓값인 231 - 1

printf("변수 num에 저장된 값은 %d입니다.\n", num);    

 

num = 2147483648;     // int형 타입이 저장할 수 없는 숫자인 231

printf("변수 num에 저장된 값은 %d입니다.\n", num);  

코딩연습 ▶

실행 결과

변수 num에 저장된 값은 2147483647입니다.

변수 num에 저장된 값은 -2147483648입니다.

 

위의 두 번째 실행 결과를 살펴보면, 변수 num에 양수를 대입했지만 음수로 저장된 것을 확인할 수 있습니다.

이처럼 오버플로우가 발생하면 전혀 예상치 못한 결과를 얻을 수 있으므로, 데이터를 저장할 때는 언제나 해당 데이터 타입의 최대 크기까지 고려해야 합니다.

 

컴퓨터는 내부적으로 정수형 중에서도 int형의 데이터를 가장 빠르게 처리합니다.

따라서 정수형 데이터는 보편적으로 크기에 상관없이 int형을 가장 많이 사용합니다.

 int형은 운영체제의 환경에 따라 다릅니다.

16bit라면 2바이트, 32bit라면 4바이트, 64bit이상부터 4바이트입니다. 


실수형 타입

C언어에서 실수란 소수부나 지수가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가집니다.

하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계를 지닙니다.

이러한 실수형 데이터의 오차는 C언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제입니다.

 

컴퓨터에서 실수를 표현하는 방식에 대한 더 자세한 사항은 C언어 실수의 표현 수업에서 확인할 수 있습니다.

C언어 실수의 표현 수업 확인 =>

 

실수형 타입 할당되는 메모리의 크기 데이터의 표현 범위
float 4 바이트 (3.4 X 10-38) ~ (3.4 X 1038)
double 8 바이트 (1.7 X 10-308) ~ (1.7 X 10308)
long double double형과 동일함. double형과 동일함.

 

다음 예제는 소수점을 16자리 가지는 실수를 float형과 double형 변수에 각각 대입하는 예제입니다.

예제

float num01 = 3.1415926535897932;  // float 타입의 유효 자릿수는 소수점 6자리

printf("변수 pi에 저장된 값은 %.20f입니다.\n", num01);    

 

double num02 = 3.1415926535897932; // double 타입의 유효 자릿수는 소수점 16자리

printf("변수 pi에 저장된 값은 %.20f입니다.\n", num02);

코딩연습 ▶

실행 결과

변수 num01에 저장된 값은 3.14159274101257324219입니다.

변수 num02에 저장된 값은 3.14159265358979311600입니다.

 

위의 예제에서 변수 num01에는 소수점 6자리까지만 정확한 값이 저장되어 있고, 소수점 7자리부터는 틀린 값이 저장되어 있습니다.

또한, 변수 num02에는 소수점 15자리까지만 정확한 값이 저장되어 있고, 소수점 16자리부터는 틀린 값이 저장되어 있는 것을 확인할 수 있습니다.

 

이처럼 실수형 데이터의 타입을 결정할 때는 표현 범위 이외에도 유효 자릿수를 반드시 고려해야 합니다.

실수형 타입 지수의 길이 가수의 길이 유효 자릿수
float 8 비트 23 비트 소수 부분 6자리까지 오차없이 표현할 수 있음.
double 11 비트 52 비트 소수 부분 15자리까지 오차없이 표현할 수 있음.

 

과거에는 실수를 표현할 때 float형을 많이 사용했지만, 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용합니다.


문자형 타입

C언어에서 문자형 데이터란 문자 하나를 표현할 수 있는 타입을 의미합니다.

컴퓨터는 2진수밖에 인식하지 못하므로, 문자도 숫자로 표현해야 컴퓨터가 인식할 수 있습니다.

따라서 어떤 문자를 어떤 숫자에 대응시킬 것인가에 대한 약속이 필요해집니다.

 

이러한 약속 중에서 가장 많이 사용되는 것이 바로 아스키코드(ASCII)입니다.

아스키코드(ASCII)는 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식입니다.

아스키코드는 문자를 7비트로 표현하므로, 총 128개의 문자를 표현할 수 있습니다.

 

아스키코드의 구성은 다음과 같습니다.

 

 - 출력할 수 없는 33개의 문자

 - 출력할 수 있는 52개의 영문 대소문자, 10개의 숫자, 32개의 특수 문자와 1개의 공백 문자

 

문자형 타입 할당되는 메모리의 크기 데이터의 표현 범위
(signed) char 1 바이트 27 ~ 2-7
unsigned char 2 바이트 0 ~ 2-8

 

다음 예제는 char형 변수에 저장된 문자를 여러 서식 지정자를 사용하여 출력하는 예제입니다.

예제

char ch = 'a';

printf("변수 ch에 저장된 값은 %c입니다.\n", ch);

printf("변수 ch에 저장된 값은 %d입니다.\n", ch);

코딩연습 ▶

실행 결과

변수 ch에 저장된 값은 a입니다.

변수 ch에 저장된 값은 97입니다.

 

위의 예제에서 서식 지정자 '%c'를 사용하여 출력한 결과는 제대로 문자 'a'가 출력됩니다.

하지만 서식 지정자 '%d'를 사용하여 출력한 결과는 97이라는 숫자로 출력됩니다.

즉, 이것은 문자가 C++ 내부적으로는 아스키코드에 해당하는 숫자로 저장되어 있음을 보여줍니다.


연습문제