http://gracefulprograming.tistory.com/39


앞서 강좌에서 배웠던 변수를 C언어 프로그래밍에서 다루려면 우선 C언어에서 제공되는 자료형을 알아야 합니다.

오늘은 C언어의 자료형(DataType)에 대해 알아보겠습니다.


1. 자료형(DataType) 종류

C언어의 자료형은 아래와 같이 분류할 수 있습니다.

1.1 기본형 (Basic Type)

1.1.1 정수형 (Integer Type)

정수형(Integer Type)에는 int, short, long, char 등이 있습니다.  
소수점이 없는 정수를 표현할 때 사용됩니다. 

맨앞 1 bit를 부호비트로 사용하는데 부호비트도 숫자 영역으로 쓰면 양수만 표현할 수 있는 대신 더 많은 큰 숫자를 표현할 수 있습니다. 이렇게 부호비트까지 숫자로 쓰려면 앞에 unsigned를 붙인 자료형을 사용하면 됩니다.

C언어에서 정수형 타입의 한계값은 다음과 같이 limits.h 표준 헤더파일에 정의되어 있습니다.
상수의미
CHAR_BIT비트 필드가 없는 가장 작은 변수의 비트 수입니다.8
SCHAR_MINsigned char 형식 변수의 최소값입니다.–128
SCHAR_MAXsigned char 형식 변수의 최대 값입니다.127
UCHAR_MAXunsigned char 형식 변수의 최대값입니다.255(0Xff)
CHAR_MINchar 형식 변수의 최소값입니다./J 옵션이 사용된 경우, –128; 0
CHAR_MAXchar 형식 변수의 최대값입니다./J 옵션이 사용된 경우, –127; 255
MB_LEN_MAX여러 문자 상수에서의 최대 바이트 수입니다.5
SHRT_MINshort 형식 변수의 최소값입니다.–32768
SHRT_MAXshort 형식 변수의 최대 값입니다.32767
USHRT_MAXunsigned short 형식 변수의 최대 값입니다.65535(0xffff)
INT_MINint 형식 변수의 최소값입니다.–2147483648
INT_MAXint 형식 변수의 최대값입니다.2147483647
UINT_MAXunsigned int 형식 변수의 최대값입니다.4294967295(0xffffffff)
LONG_MINlong 형식 변수의 최소값입니다.–2147483648
LONG_MAXlong 형식 변수의 최대값입니다.2147483647
ULONG_MAXunsigned long 형식 변수의 최대값입니다.4294967295(0xffffffff)
_I64_MIN__int64 형식의 변수에 대한 최소값입니다.-9223372036854775808
_I64_MAX__int64 형식의 변수에 대한 최대값입니다.9223372036854775807
_UI64_MAXunsigned __int64 형식의 변수에 대한 최대값입니다.

18446744073709551615(0xffffffffffffffff)

[정수 제한 (출처: MSDN)]

1.1.2 실수형 (Floating-Point Type)

실수형 자료형에는 IEEE 754의 Single Precision 규격을 따르는 float type Double Precision 규격을 따르는 double type 등이 있습니다. 
(IEEE 754는 컴퓨터에서 부동소수점을 표현하는 표준 규약입니다.)

실수형 자료형은 모두 부호비트를 사용하기 때문에 unsigned type을 지원하지 않습니다. 
C언어에서 실수형 타입의 한계값은 다음과 같이 float.h 표준 헤더파일에 정의되어 있습니다.

상수의미
FLT_DIG DBL_DIG LDBL_DIG소수 자릿수가 q인 부동 소수점 수가 부동 소수점 표현으로 반올림되고 정밀도의 손실 없이 다시 복원될 수 있는 자릿수 q입니다.6 15 15
FLT_EPSILON DBL_EPSILON LDBL_EPSILONx + 1.0이 1.0과 같지 않은 가장 작은 양수 x입니다.1.192092896e–07F 2.2204460492503131e–016 2.2204460492503131e–016
FLT_GUARD0
FLT_MANT_DIG DBL_MANT_DIG LDBL_MANT_DIG부동 소수점 유효 숫자에서 FLT_RADIX로 지정된 기수의 자릿수입니다. 기수는 2입니다. 따라서 이러한 값이 비트를 지정합니다.24 53 53
FLT_MAX DBL_MAX LDBL_MAX표현 가능한 최대 부동 소수점 수입니다.3.402823466e+38F 1.7976931348623158e+308 1.7976931348623158e+308
FLT_MAX_10_EXP DBL_MAX_10_EXP LDBL_MAX_10_EXP10을 해당 수만큼 거듭제곱한 값이 표현 가능한 부동 소수점 수인 최대 정수입니다.38 308 308
FLT_MAX_EXP DBL_MAX_EXP LDBL_MAX_EXPFLT_RADIX를 해당 수만큼 거듭제곱한 값이 표현 가능한 부동 소수점 수인 최대 정수입니다.128 1024 1024
FLT_MIN DBL_MIN LDBL_MIN최소 양수 값입니다.1.175494351e–38F 2.2250738585072014e–308 2.2250738585072014e–308
FLT_MIN_10_EXP DBL_MIN_10_EXP LDBL_MIN_10_EXP10을 해당 수만큼 거듭제곱한 값이 표현 가능한 부동 소수점 수인 최소 음의 정수입니다.–37
–307
–307
FLT_MIN_EXP DBL_MIN_EXP LDBL_MIN_EXPFLT_RADIX를 해당 수만큼 거듭제곱한 값이 표현 가능한 부동 소수점 수인 최소 음의 정수입니다.–125
–1021
–1021
FLT_NORMALIZE0
FLT_RADIX _DBL_RADIX _LDBL_RADIX지수를 표현하는 기수입니다.2 2 2
FLT_ROUNDS _DBL_ROUNDS _LDBL_ROUNDS부동 소수점 더하기의 반올림 모드입니다.1 (near) 1 (near) 1 (near)
[부동 제한 (출처: MSDN)]


1.2 열거형 (Enumerate Type)

열거형은 int type과 같은 크기를 갖는 자료형입니다. 
주로 코드의 가독성을 높이기 위해 상수에 의미있는 별명을 부여하거나 미리 정의된 변수의 값만 사용하도록 제한을 할 때 사용합니다.

enum { GIRL = 0, BOY = 1 }; 이런식으로 define 해서 사용하고자 하는 값을 미리 정의합니다.

1.3 Void형 (The Type void)

void형은 '값이 존재하지 않는' 것을 나타낼 때 사용하는 자료형입니다. 
다음과 같이 사용합니다.

1.3.1 함수 리턴값 (Function returns as void)

함수에서 반환하는 값이 없을 때 사용. 

void exit(int code);

1.3.2 함수 매개변수 (Function arguments as void)

함수에 입력되는 매개변수가 없을 때 사용.

int Terminate(void);

1.3.3 포인터 (Pointers to void)

포인터가 가리키는 자료형(DataType)이 정의되지 않았을 때 사용. 
예를들어 malloc 과 같은 heap 메모리 할당함수의 경우 void* 를 리턴합니다. void*로는 실제 값에 접근할 수 없기 때문에 반드시 자신이 필요한 자료형으로 캐스팅(casting) 해서 사용해야 합니다. 

 int *p = (int*)malloc(sizeof(int));

1.4 파생형 (Derived Type)

파생형(Derived Type)에 대해서는 각각의 내용이 워낙에 방대하다 보니 나중에 하나씩 따로따로 자세하게 다루도록 하겠습니다. 
지금은 그냥 이런 것들이 있다 정도만 파악해 주세요.

1.4.1 포인터형 (Pointer Type)

1.4.2 배열형 (Array Type)

1.4.3 구조체형 (Structure Type)

1.4.4 공용체형 (Union Type)

1.4.5 함수형 (Function Type)


2. 자료형별 크기

이전 강좌에서 변수의 자료형(DataType)은 메모리에 할당할 변수의 크기를 결정한다고 말씀드렸습니다.

표준 라이브러리에는 각 자료형 별로 기본적으로 메모리 크기가 정의되어 있습니다.


일부 자료형의 크기는 OS의 메모리 주소 체계(32bit/64bit)에 따라 달라집니다.

이러한 차이는 로컬 환경에서 구동되는 프로그램인 경우 크게 문제될 부분은 없지만 네트워크를 통해 다른 프로그램과 통신을 하는 경우에는 문제가 생길 수 있으니 주의해야 합니다.


OS32bit64bit(windows)64bit(linux)
데이터 표현 모델ILP32LLP64LP64
분류변수 타입size(byte)size(byte)size(byte)
정수형
char111
short int222
int444
long int448
long long888
pointer488
size_t488
실수형
float444
double888

위 표에서 보시는바와 같이 LP64 모델을 사용하는 Linux 64bit 에서는 long 이 8byte로 확장되었습니다. 

이 부분을 꼭 기억해주세요. 

64bit OS에서는 메모리 주소를 64bit로 표현하기 때문에 주소값을 갖는 포인터(Pointer)도 8byte로 확장이 됩니다. 

64bit 환경에서 구동되는 프로그램을 개발할 때 주의해야 할 부분에 대해서는 나중에 자세히 다루도록 하고 본 강좌에서는 ILP32 모델 기준으로 설명드리겠습니다.


참고사항

  • ILP32Int, Long, Pointer를 32bit로 표현하는 데이터 표현 모델
  • LLP64Long Long, Pointer를 64bit로 표현하는 데이터 표현 모델
  • LP64Long, Pointer를 64bit로 표현하는 데이터 표현 모델


여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

-Peter의 우아한 프로그래밍



출처: http://gracefulprograming.tistory.com/39 [Peter의 우아한 프로그래밍]