데이터는 메모리에 어떻게 저장될까?
우리가 사용하는 정수, 실수, 포인터 같은 값들은 모두 메모리의 바이트 배열로 저장됩니다. 이번 3.3절은 이 값들이 실제로 어떻게 저장되고, 어떤 크기를 가지며, 또 어떤 의미를 가지는지를 알려줍니다.
C의 데이터 타입과 바이트 크기
x86-64 시스템에서 각 기본 타입은 아래와 같은 바이트 수를 차지합니다.
데이터 타입 | 바이트 수 |
char | 1 byte |
short | 2 bytes |
int | 4 bytes |
long | 8 bytes (x86-64 기준) |
float | 4 bytes |
double | 8 bytes |
pointer | 8 bytes (x86-64 기준) |
이런 크기를 알아두는 이유는, 이후 포인터 연산, 메모리 접근, 구조체 해석에서 각 타입이 얼마만큼의 메모리 공간을 차지하는지를 정확히 파악해야 하기 때문입니다.
예를 들어, 우리가 아래와 같이 변수를 선언한다고 해보겠습니다.
char a = 'A';
int b = 42;
long c = 123456789;
이 변수들은 메모리 상에서 각각 다음과 같이 저장됩니다. (x86-64 기준)
변수 | 타입 | 바이트 수 | 메모리 표현 (예시) |
---|---|---|---|
a | char | 1 | 0x41 |
b | int | 4 | 2a 00 00 00 (리틀 엔디안) |
c | long | 8 | 15 cd 5b 07 00 00 00 00 (리틀 엔디안) |
즉, C 언어에서 단순히 선언한 변수도 실제로는 바이트 단위의 배열로 메모리에 저장되며, 리틀 엔디안 시스템에서는 가장 작은 바이트가 가장 앞쪽(낮은 주소)에 위치합니다.
기계 관점에서의 용어: 워드(Word)
x86 아키텍처에서는 다음과 같은 단위를 사용합니다.
용어 | 크기 |
byte | 8 bits |
word | 2 bytes |
double word (dword) | 4 bytes |
quad word (qword) | 8 bytes |
우리가 흔히 말하는 "워드"는 2바이트이고, 64비트 머신에서는 "쿼드 워드"가 가장 기본 단위인데요. 이는 레지스터의 크기, 메모리 접근의 범위, 명령어의 처리 단위를 정하는 등의 용도로 사용됩니다.
왜 타입의 바이트 수를 정확히 알아야 할까?
sizeof 연산자나 구조체 정렬을 이해하려면 각 타입이 몇 바이트를 차지하는지 정확히 아는 것이 중요합니다. 예를 들어, 구조체 안에서 int 두 개가 있다고 해도, 포인터 하나가 그보다 더 많은 메모리 공간을 차지할 수 있습니다.
이런 바이트 단위에 대한 이해는 단순한 기초 지식을 넘어서, 메모리 낭비를 줄이는 메모리 최적화, 다른 시스템과의 호환성을 고려한 설계, 디버깅 중 필드 위치를 정확히 파악하는 능력으로 이어집니다. 즉, 이는 실무에서 꼭 필요한 기본이자 핵심 역량이라고 할 수 있지요.
문자열은 어떻게 저장될까?
C 언어에서 문자열은 null 문자(0x00)로 끝나는 char 배열로 표현됩니다. 예를 들어, "CSAPP"라는 문자열은 메모리 상에 43 53 41 50 50 00 (ASCII + null)로 저장되며, strlen 함수는 이 null 문자를 기준으로 문자열의 길이를 판단합니다.
이러한 구조 덕분에 문자열의 길이를 알기 위한 별도의 메타데이터는 필요 없지만, 동시에 null 문자가 빠지면 오류가 발생할 수 있어 문자열 처리 시 항상 주의가 필요합니다.
마치면서
C의 기본 타입은 x86-64에서 정해진 바이트 크기로 저장되며, 우리는 이 크기를 바탕으로 메모리 레이아웃과 연산의 정확한 결과를 예측할 수 있습니다.
다음 절에서는 드디어 연산 명령어들을 다룹니다. add, sub, imul 같은 연산들이 기계 수준에서 어떻게 표현되는지를 알아보겠습니다. 감사합니다.
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 3장 완전 정복] x86-64 어셈블리 필수 배경지식 핵심 정리 (0) | 2025.04.06 |
---|---|
[CSAPP 3장 완전 정복] 3.5 기계 수준의 연산, 어떻게 작동할까? (0) | 2025.04.05 |
[CSAPP 3장 완전 정복] 3.2 어셈블리 명령어는 어떻게 저장될까? (0) | 2025.04.05 |
[CSAPP 3장 완전 정복] 3.1 어셈블리 언어와 친해지는 첫 걸음 + 추천 학습 순서 (0) | 2025.04.05 |
[CSAPP 1.8~1.9] 기초개념: 네트워크 개요, 시스템에서 중요한 개념(암달의 법칙, 동시성과 병렬성, 추상화) (0) | 2025.03.31 |