상세 컨텐츠

본문 제목

[C++] 자료형 (Data Type)

C++

by 이나시오- 2024. 2. 29. 02:16

본문

자료형은 어떤 데이터를 메모리에 저장하기 위해 정해진 형식이다. 자료형을 통해 내가 보고 있는 메모리가 어떤 형태의 데이터인지를 알 수 있다.

 

자료형의 핵심은 메모리의 크기 (size)와 그 메모리를 해석하는 방식이다.

다음은 대표적인 자료형을 정수형/실수형으로 구분하여 나타낸 것이다.

 

정수형 자료형 - char (1Byte), short (2Byte) , int (4Byte) , long (4Byte) , long long (8Byte) , int64__ (8Byte)

실수형 자료형 - float (4Byte) , double (8Byte)

 

1Byte는 8Bit로, 1Bit 는 전기신호가 없냐/있냐로 0/1의 정보를 저장하는 최소 단위이다. 즉 N bit로 2^N 가지의 다른 정보를 나타낼 수 있다.

 

char형 같은 경우 1Byte이므로 2^8=256가지의 서로 다른 정보를 나타낼 수 있다.

unsigned char c1;
signed char c2;

 

unsinged 키워드가 붙으면 0 이상의 정수만 나타내고, signed를 붙이면 음수도 표현할 수 있다. signed는 보통 생략된다.

c1은 0~255의  숫자 범위를 저장할 수 있고, c2는 -128~127까지의 숫자 범위를 저장할 수 있다. c2의 경우 음수 128개, 0이상의 정수 128개로 반반 나누었기 때문에 나타난 결과이다.

 

값의 부호는 데이터의 가장 앞자리 비트로 결정된다. 이를 Most Significant Bit (MSB)라고 하며, 0일 경우에는 양수, 1일 경우에는 음수를 나타낸다. 양수는 이진법 계산과 동일하게 값을 알아낼 수 있지만 음수는 조금 다르다. 컴퓨터 연산의 편의성을 위해서 음수는 "양수와 더해서 0이 되는 수"로 정의된다. 여기서 0이라 함은 내가 바라보고 있는 메모리의 모든 비트 수가 0이 된다고 이해할 수 있다. 여기서 이용되는 것이 오버플로우 (overflow)이다.

 

오버플로우는 연산을 통해 우리가 바라보고 있는 메모리 공간보다 넘친 값을 저장하다보니 값이 소실되는 현상이다. unsigned char 타입의 데이터 범위가 0~255이라고 했는데, 만약 unsigned char 타입 255에 1을 더하는 연산을 수행했다면 연산 결과가 자료형이 가지는 비트 수를 넘어가는 현상이 발생하고, 다시 최솟값인 0으로 돌아가게 된다. 이러한 현상이 음수의 비트표현을 구하는 데 사용된다.

 

예를 들어 char형 데이터에서 -8이 어떻게 나타나는지 알아보면,

우선 양수 8은 00001000 로 나타날 것이다. 여기에 우리가 알고싶은 -8의 비트 표현을 더하면 0 (오버플로우를 생각하면 100000000)이 되어야 한다. 이제 8의 모든 비트를 뒤집어보면 11110111이 될텐데, 이를 8과 더해보면 11111111이 될 것이다. 여기에 1만 더 더해지면 우리가 원하는 상황이 만들어지게 되는 것으로 생각할 수 있고, 따라서 어떤 음수의 비트 형태를 구하려면 다음과 같은 과정을 거치면 된다.

 

(1) 양수가 표현되는 비트를 생각한다.    00001000

(2) 그 비트를 모두 반대로 뒤집는다.       11110111

(3) 여기에 1을 추가로 더한다.                 11111000

 

따라서 -8은 11111000로 나타나게 되는 것이다. 이를 2의 보수법 (2's complement)이라고도 한다. 사실 과거에는 직관적으로 맨 앞 비트만 1로 두고, 나머지 비트로 양수와 동일하게 표현하는 방식도 존재했으나 연산의 효율성을 위해 (특히 뺄셈) 이와 같이 발전된 것으로 알고 있다. 또한 2의 보수법으로 나타낼 경우 +0과 -0이 동일하게 00000000 으로 나타난다는 특징도 있다.

 

여담으로 int와 long은 동일하게 4byte인데,  실제로 차이점이 없다. 원래 int는 크기를 가변적으로 조절할 수 있는 데이터 타입으로 설계될 예정이었으나 Windows의 32bit 운영체제가 오래 지속되면서 4byte 정수형 타입으로 굳어지게 되었다고 한다.

 

 

실수형 자료형은 정수형 자료형과 데이터 표현 방법이 완전히 다르다. 부호를 MSB를 통해 나타내는 것은 동일하지만, 나머지 비트의 활용이 달라진다. IEEE의 부동소수점 방식이 채택되어 비트를 크게 MSB/지수/가수의 3가지 부분으로 나눈다. -118.625를 부동소수점 표현으로 나타내보자. 우선 음수이기 때문에 MSB는 1이 될 것이고, 118.625를 이진법 표현으로 나타내면 1110110.101이 된다. 10진법에서 자릿수가 내려가면 1/10이 되듯이 2진법은 자릿수가 내려가면 1/2이 되므로 0.625 = 0.5*1 + 0.25*0 + 0.125*1 이기 때문에 소수점 아래가 .101로 나타난 것이다. 이제 이 숫자를 소수점 위로 1의 자리만 남기고 모두 소수점 아래로 내려 1.110110101 * 2^6 과 같이 나타낼 수 있다. 여기서 소수점 아래 부분이 가수 부분에 들어가게 되고, 지수 부분에는 곱해진 2의 지수 6에 Bias를 더해서 들어간다. 이러한 이진법 방식으로 실수를 표현하기 때문에, 실제로 내가 표현하고자 하는 값과 오차가 있을 수 있다는 특징이 있고, 소수점 아래로도 표현할 수 있는 범위가 제한되어 있기 때문에 정밀도가 존재한다. float의 경우 MSB 1bit, 지수부 8bit, 가수부 23bit로 구성되므로 (1/2)^23이 약 0.00000012 이기 때문에 최대 7자리까지 정확히 나타낼 수 있고, 이것이 곧 정밀도가 된다. 마찬가지 원리로 double형은 15자리의 정밀도를 갖는다. 숫자의 정밀도에 따라 float과 double을 잘 결정해야 한다.

 

참고로, 갑자기 Bias라는 개념이 튀어나왔는데, 이를 이해하려면 부동소수점 방식으로 0을 어떻게 나타낼 것인가를 고민해봐야 한다. 정수표현에서 0은 너무나 간단히 모든 비트가 0이면 되지만 부동소수점 방식에서 모든 비트가 0이면 1.0 * 2^0 이므로 값이 1이 된다. 부동소수점 방식으로 0을 표현하기 위해 Bias라는 방식을 사용하게 되었다. 여기서 0은 부동소수점 방식으로 나타낼 수 있는 가장 작은 양수로 정의된다. float의 경우 MSB 1bit, 지수부 8bit, 가수부 23bit로 구성되므로 1.0 * 2^(-127)이 양의 최솟 값이 된다. 이를 모든 비트가 0인 표현상태 ( 00000000 00000000 00000000 00000000 )로 나타내기 위해 Bias가 127로 설정되어서 더해지는 것이다.

부동소수점 방식 : https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

'C++' 카테고리의 다른 글

[C++] 함수 객체 (Functor)  (0) 2024.08.08
[C++] 함수 포인터  (0) 2024.03.19
[C++] 포인터  (0) 2024.03.19
[C++] Struct (구조체)  (0) 2024.03.12
[C++] 변수의 종류와 메모리 영역  (0) 2024.03.01

관련글 더보기