본문 바로가기
dev, tech

C의 데이터형의 분류

by 구띵 2006. 6. 16.

기본 데이터형(basic type)

 : 문자형, 정수형, 부동형, 열거형

 

유도 데이터형(derived type)

 : 배열, 함수, 구조체, 공용체, 포인터

 

void형

 

 

문자형(character type)

 - 음수 표현 능력에 따라,

           char

           signed char (-127~127)

           unsigned char (0~255)

 

 - 크기는 모두 1바이트로, 바이트 정의에 의해 8비트 이상으로 구성된다.

 - 사용 중인 1바이트의 크기를 알기 위해서는 <limits.h>의 CHAR_BIT 매크로 값을 조사하면 된다.

 - 일반 char형은 signed char나 unsigned char 중 하나와 똑같은 범위를 갖는데, 이는 임플리멘테이션에 따라 달라지므로, char의 음수 표현 여부에 의존하면 이식성을 얻을 수 없다.

 하지만, C에서의 문자들의 코드 값은 signed char가 표현할 수 있는 양수 값과 unsigned char가 표현할 수 있는 양수 값의 공통 부분에 존재하며, 그 외의 문자의 경우 음수 표현 여부에 따라 그 값은 음수가 될 수도 있다.

 

정수형(integer type)

 - 크기(표현 가능한 값의 범위)에 따라

           shot int

           int

           long int

 - 각각에 signed 예약어를 붙인 데이터형은 동일한 데이터형이다.

   singed라는 예약어의 존재가 데이터형에 영향을 주는 경우는 구조체에서 설명할 비트 필드와,

   char형일 때뿐이다.

 - int형은 해당 임플리멘테이션이 가장 효율적이라고 추천하는 데이터형이다.

   해당 실행환경의 워드(word:cpu가 한번에 처리할 수 있는 단위)에 대응한다는 것으로, 시스템마다 워드의 크기는  임플리멘테이션에 따라 변할 수 있다는 것이다.

 

   표준이 보장하는 최소한의 범위는, int(=short int) (-32767~32767)이며,

      long int(-2147483647~214748367)과 같다. 여기서 최소한 보장되는 범위란 말 그대로 각각의 데이터형이 모든 임플리멘테이션에서 표현할 수 있는 값의 범위를 의미한다. 즉, 표준이 요구하는 범위보다 더 넓은 범위의 수(작거나 더 크거나)를 다룰 수 있는 것으로 정의할 수 있다. 하지만, 이식성 있는 프로그램은 그와 같은 임플리멘테이션의 확장에 의존해서는 안된다.

 

  - 값의 범위와 데이터형이 메모리에서 차지하는 크기

         shot int <= int <= long int

  - 어떤 두 정수형이 우연히 혹은 의도적으로 같은 크기와 범위를 갖는다고 해도 이 둘은 분명히 다른 데이터 형이다

 

  - 정수형의 선택

     a. 음수 값을 표현해야 하는가?

     b. 메모리를 절약해야 하는가?

     c. 얼마나 큰 값을 표현해야 하는가?

     d. 비트 단위의 연산이 적용되는가?

     e. 오버플로우가 발생할 가능성이 있는가?

     f. 정확한 비트로 구성된 정수형이 필요한가?

 

     음수일 가능성? -> 무부호 정수형 선택 불가

     표준이 int형으로 표현할 수 있는 최대 값보다 큰 값이 필요? -> (unsigned) long int

     큰 값을 저장할 필요는 없지만, 메모리나 디스크 공간이 부족? -> (unsigned) shot int

     메모리를 아낄 필요도 없고, (unsigned) long int형에서 보장하는 만큼 큰 값을 가질 필요도 없다면? -> (unsigned) int

 

     만약 음수를 저장할 필요가 없는 상황에서 오버플로우의 발생 가능성이 있거나 비트 단위의 연산이 적용된다면 무부호 정수형을 선택하는 것이 낫다. 비트 단위의 연산은 무부호 정수형에 대해서만 올바르게 정의되며, 오버플로우에 대한 걱정이 전혀 없기 때문이다. 그러나, 무부호 정수형을 함수로 수식에 사용하면 문제가 발생했을 때 쉽게 찾아내기가 어렵다.

 

     표준이 어떤 데이터형을 이름 뒤에 숨긴 wchar_t나 size_t와 같은 데이터형은 그 이름 그대로 다뤄야 한다. 그 데이터형이 각 임플리멘테이션마다 다른 데이터형으로 매핑될 수 있기 떄문이다.

 

 

댓글