강께르의 개발일지

[C++] 자료형에 대한 조사 및 정리 본문

프로그래밍/C++

[C++] 자료형에 대한 조사 및 정리

강께르 2021. 6. 2. 12:49

1. 기본 자료형

 자료형, 데이터 타입이라고 내게 더 익숙하지만, MS Docs 기준의 명칭으로는 Bulit-in type으로, 기본 자료형이라고 명시되어있다. 이는 C++ 언어의 표준으로 지정되어 헤더파일에 저장되어 있는 게 아닌 컴파일러가 사용하는 이들에게 제공되는 것이다. 기본 자료형은 세 가지 범주로 나타낼 수 있으며, 이는 정수형, 부동 소수점형, void형이 있다. 각각의 자료형은 컴파일러에 의해서 그 자료형에 맞는 고유한 방식으로 처리하게 된다. 다음은 각각의 자료형과 그 자료형이 지니고 있는 값의 범위와 바이트의 크기, 조사하면서 알게 된 특징에 대해 적으려고 한다.

 

2. 정수형

 모든 자료형의 범위는 해당 자료형의 바이트 크기의 영향을 받는다. 예를 들어서 int형 자료형은 바이트 크기가 4바이트인데, 이를 컴퓨터가 표현할 수 있는 최소 데이터 단위인 비트로 바꾸면 32비트라는 값을 얻을 수 있다. 데이터 범위는 2의 (비트)제곱만큼의 수를 가진다. 예를 들어, unsigned char는 바이트 크기가 1바이트인데 이는 8비트이므로 데이터 범위는 2의 8제곱을 계산하여 256이라는 것을 알 수 있다. 하지만 아래에 기재된 표에 의하면 unsigned char의 데이터 범위는 0 ~ 255이다. 이는 8비트가 표현할 수 있는 최대의 수가 255이기 때문이다. 각 비트가 표현할 수 있는 최대의 수는 2의 (해당 비트)제곱 - 1이다. 그러므로 8비트의 최대가 표현할 수 있는 최대 범위는 255가 된 것이다.

 

 양수는 모든 정수형 자료형에서 표현할 수 있다. 하지만 음수와 같이 부호를 지니고 있는 정수의 표현은 어느 자료형을 사용하느냐에 따라서 사용이 제한될 수 있다. 이에 대한 구분은 signed와 unsigned 키워드가 있다. 사용하고자 하는 자료형의 앞에 붙여서 사용하고자 하는 의미를 살리는데, signed는 양수, 음수 값을 데이터 범위로 모두 사용하는 키워드이고, unsigned는 음수를 제외한, 0을 포함한 양수 값을 데이터 범위로 사용하는 키워드이다. 예를 들어, unsigned char 자료형은 0 이상의 양수 범위를 사용하므로, 바이트 크기 1바이트에 해당되는 값인 256을 양수에 맞춰서 표현하는 것으로 범위는 0 ~ 255가 된다. 하지만 char 자료형은 signed 키워드를 묵시적으로 앞부분에 붙인 것을 생략한 모습이므로, 음수와 양수를 모두 표현할 수 있는데 바이트 크기 1바이트에 해당되는 값 256만큼 음수와 양수를 표현해야하기에 약 절반을 나눠 음수와 양수를 표현한다. 그렇기에 char형 데이터 범위는 -128 ~ 127를 가진다.

 

 정수형은 기본적인 형식으로 int 자료형을 사용한다. 하지만 int 자료형의 데이터 범위로 표현하고자 하는 수가 없는 경우나 int 자료형만큼의 바이트 크기를 사용하지 않아도 되는 경우 등 다른 정수 자료형을 사용할 때도 있다. 이를 위해 short, long, long long 자료형이 있다. 각 자료형의 크기 관계는 다음과 같다.

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

 short 자료형은 16비트 이상, long 자료형은 32비트 이상, long long 자료형은 64비트 이상이어야 한다. 그리고 사용하고 있는 short, long, long long, unsigned, signed은 여러가지 동의어를 가지고 있다. 아래는 동의어끼리 모아서 한 줄로 정리해놓은 것이다.

 ○ short, short int, signed short, signed short int

 ○ unsigned short, unsigned short int

 ○ int, signed, signed int

 ○ unsigned, unsigned int

 ○ long, long int, signed long, signed long int

 ○ unsigned long, unsigned long int

 ○ long long, long long int, signed long long, signed long long int

 ○ unsigned long long, unsigned long long int

 

2. 부동 소수점형

 부동 소수점형, 다른 말로 실수형이라고 하는 이것은 정수형에 소수점을 포함하여 더욱 세밀하고 광범위한 값을 표현하기 위해 제공되는 자료형이다. 부동 소수점형의 종류로 float, double, long double이 있다. 이 세 자료형에 대한 크기 관계는 다음과 같다.

sizeof(float) <= sizeof(double), sizeof(double) <= sizeof(long double)

 한 가지 눈에 들어오는 것은 float 자료형과 double 자료형이 같을 수 있다고해서 float 자료형이 long double 자료형과 같을 수 있는 것은 아니다. MS Docs에서는 long double과 double을 컴파일러에서 동일하게 처리한다고 한다. 

 

3. void형

 void형은 값이 없는 집합을 이야기한다. void형은 값을 아무것도 반환하지 않는 함수를 선언하거나 임의로 지정하여 어느 형식으로 변환 혹은 캐스팅 가능한 generic 포인터로 주로 사용된다. 하지만 다음 3가지 상황에서 사용이 제한된다.

 - 표현 구문, 콤마 연산자 의 왼쪽 피연산자, 삼항 연산자의 2번째나 3번째 피연산자

 

4. std::nullptr_t

 다음은 MS Docs에서 주된 세 가지라고 표현한 자료형 이외의 설명을 기재해놓았다. C++11에 추가된 nullptr은 포인터에 0이나 NULL 대신 어떤 값도 가리키지 않는 포인터로 명시하기 위해 존재하는데 이것의 자료형이 std::nullptr_t이다.

이것 역시 기본 자료형으로 취급된다.

 

5. bool형

 bool형은 참과 거짓을 구분하는 true와 false만을 나타내기 위한 자료형이다. 2가지 수를 위해 1바이트라는 크기는 낭비일 수 있으나 최소 1바이트의 의미를 갖는 8비트가 되어야 메모리에 대한 액세스 등 여러가지 필요한 이유에 부합되기에1바이트를 할당하는 것 같다.

 

6. 문자형

문자형인 char 자료형은 문자들을 효율적으로 인코딩하기 위한 문자 표시 형식이다. C++에서는 char를 signed char, unsigned char로 서로 다른 형식으로 처리한다. 이 둘은 비트단위 작업의 경우 표현되는 범위의 차이에 따라 형식을 나눈 것으로 보인다.

 wchar_t는 확장 문자 또는 멀티바이트 문자 형식이며 일반적인 1바이트 문자보다 큰 유니코드 문자를 표현하기 위해 사용된다. 문자열 앞에 L 접두사를 붙여 wchar_t임을 명시하는 방법이 있다. char*_t은 utf-* 문자 표현에 사용된다. 여기서 *는 8, 16, 32의 숫자를 의미한다.

 

 다음은 기본 자료형의 데이터 범위와 바이트 크기를 정리해 놓은 것이다.

이름 범위 바이트 크기
int –2,147,483,648 ~ 2,147,483,647 4
unsigned int 0 ~ 4,294,967,295 4
bool false 또는 true 1
char -128 ~ 127 1
signed char -128 ~ 127 1
unsigned char 0 ~ 255 1
short –32,768 ~ 32,767 2
unsigned short 0 ~ 65,535 2
long –2,147,483,648 ~ 2,147,483,647 4
unsigned long 0 ~ 4,294,967,295 4
long long –9,223,372,036,854,775,808 ~
9,223,372,036,854,775,807
8
unsigned long long 0 ~ 18,446,744,073,709,551,615 8
enum   상황마다 다름
float 3.4E+/-38(7개의 자릿수) 4
double 1.7E+/-308(15개의 자릿수) 8
long double double과 동일 double과 동일
wchar_t 0 ~ 65,535 2