C언어의 자료형은 크게 정수형과 실수형으로 나눌 수 있다.
정수형은 0과 자연수만을 표현하는 형(unsigned)과 음수도 표현할 수 있는 형(signed)으로 또다시 나뉘는데 이 이야기는 여기서는 넘어가기로 한다.
대개 많은 블로그나 책자에서 자료형의 크기를 이렇게 설명하고 있다.
정수형 크기
char 1바이트 (8비트)
short 2바이트 (16비트)
int 4바이트 (32비트)
long 4바이트 (32비트)
long long 8바이트 (64비트)
실수형 크기
float 4바이트 (32비트)
double 8바이트 (64비트)
long double 12바이트 (96비트)
그러나 이것은 32비트 시스템에서 저렇게 정의된다. 요즘은 개인 PC에서도 64비트 시스템을 많이 사용하고 있다. C언어의 자료형은 JAVA등에서의 자료형과 달리 시스템에 따라 자료형의 크기가 달라진다. 다음을 보자.
[정수형 크기]
16비트 시스템
char : 1바이트
short : 2바이트
int : 2바이트
long : 4바이트
long long : 사용되지 않음
32비트 시스템
char : 1바이트
short : 2바이트
int : 4바이트
long : 4바이트
long long : 8바이트
64비트 시스템
char : 1바이트
short : 2바이트
int : 4바이트
long : 8바이트
long long : 8바이트 혹은 그 이상
int 는 시스템의 기본 연산 단위를 사용하였다. 따라서 16비트 시스템에서는 short와 같은 크기, 32비트 시스템에서는 long 과 같은 크기이다.
그런데 64비트 시스템으로 오면서 int 를 long보다 큰 8바이트로 하기에는 자료형의 본래 취지에서 벗어나기에 int 대신 long 을 8바이트로 확장하였고, int가 4바이트 크기를 그대로 사용함으로써 4바이트 크기의 자료형을 독자적으로 담당하게 된다.
long long 은 C99에서 표준화되었다. 따라서 1999년 이전에 이미 PC시장에서 거의 사라진 16비트 시스템에서는 long long을 사용하지 않는다.
일부 MS Window 계열에서만 프로그래밍을 했던 분이 블로그에 적어놓기를, long long 자료형은 리눅스의 gcc에서나 사용이 가능한 것이라고 비하 아닌 비하(?)를 하는 글을 보았는데, long long 은 이미 1999년에 C언어의 표준 자료형으로 채택이 되었다. MS의 컴파일러가 다른 컴파일러에 비해서 C의 표준을 매우 느리게 따라가는 경향이 있기에 생긴 오해라고 본다. (단적인 예가 stdint.h 라는 헤더파일인데, 여기서는 이에 대한 이야기는 넘어가기로 한다.)
실수형 크기는 시스템에 따라 달라지지 않는 것이 통상적이다. float 는 4바이트, double 은 8바이트로 거의 고정이라고 보아도 된다. long double은 시스템에 따라 12바이트보다 클 수도 있겠지만 아직 그런 경우를 본 적이 없어 확답을 하지 못하겠다.
16비트 시스템에서도 float는 4바이트를 사용한다. 그 이유는 두가지 정도인데, 첫째는 실수형에 대한 표준은 컴퓨터에서 부동소수점을 표기하는 표준으로 IEEE 754가 정의되어 있는데 그곳에서 4바이트 실수 자료형은 반드시 구현해야 한다는 기준이 있기 때문이며, 또 하나는 만일 실수형을 2바이트로 표현한다면 표현할 수 있는 수의 범위도 작고, 오차도 너무나 커서 사용할 수 없기 때문이다.
그런데, 사실상 이 4바이트 실수 자료형도 요즘은 오차가 커서 별로 사용하지 않는다. 그래서 현재는 특별한 경우가 아니면 일반적으로 실수 자료형으로 double을 많이 사용한다.
~~~~
참고되었습니다. 감사합니다. ^^
답글삭제