자료형 (Data Type)
들어가는 말
자료형은 자료의 형태가 어떠한지, 어떻게 다룰지를 정의하는 규칙이다.
왜 필요할까?
컴퓨터 메모리 위에서 모든 데이터는 그저 비트의 나열일 뿐이다.
동일한 비트열도 어떻게 해석하느냐에 따라 전혀 다른 값이 된다.
자료형은 이 모호함을 해소한다.
값을 저장하거나 읽어올 때 몇 비트를 사용할지, 그 비트를 어떻게 해석할지, 어떤 형태로 표현할지, 그리고 어떤 연산이 가능한지를 자료형이 결정한다.
같은 값, 다른 비트 패턴
자료형은 값을 저장하는 방식을 결정한다.
int a = -1;
float b = -1;
| 변수 | 자료형 | 16진수 표현 |
|---|---|---|
a |
int (4 byte) |
FF FF FF FF |
b |
float (4 byte) |
BF 80 00 00 |
같은 4바이트 자료형이지만 수를 저장하는 방식이 달라 비트 패턴이 다르다.
int는 2의 보수(Two’s complement) 방식으로 저장한다.
float는 부호(Sign)비트, 지수(Exponent)부, 가수(Mantissa)부로 나뉜 IEEE 754 방식으로 저장한다.
같은 비트 패턴, 다른 해석
동일한 비트 패턴도 자료형에 따라 전혀 다른 값으로 해석된다.
int a = 0b01000001;
char b = 0b01000001;
printf("%d\n", a); // 65
printf("%c\n", b); // A
unsigned int u = 0xFFFFFFFF;
int s;
memcpy(&s, &u, sizeof(s));
printf("%u\n", u); // 4294967295
printf("%d\n", s); // -1
자료형에 따라 달라지는 연산
자료형은 어떤 연산이 가능한지도 결정한다.
int는 사칙연산과 나머지(%) 연산이 모두 허용된다.
double는 나머지 연산이 허용되지 않는다.
자료형은 연산자의 의미까지도 변경한다.
예를 들어 C++에서 +는 정수 사이에서는 덧셈을 의미하지만, std::string 에서는 문자열 연결을 의미한다.
int n = 1 + 2; // 3
std::string s1 = "hello";
std::string s2 = " world";
std::string result = s1 + s2; // "hello world"