[CSAPP 3장 완전 정복] 3.3 데이터는 메모리에 어떻게 저장될까?

2025. 4. 5. 19:07·크래프톤 정글/컴퓨터구조(CSAPP)

데이터는 메모리에 어떻게 저장될까?

우리가 사용하는 정수, 실수, 포인터 같은 값들은 모두 메모리의 바이트 배열로 저장됩니다. 이번 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
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 3장 완전 정복] x86-64 어셈블리 필수 배경지식 핵심 정리
  • [CSAPP 3장 완전 정복] 3.5 기계 수준의 연산, 어떻게 작동할까?
  • [CSAPP 3장 완전 정복] 3.2 어셈블리 명령어는 어떻게 저장될까?
  • [CSAPP 3장 완전 정복] 3.1 어셈블리 언어와 친해지는 첫 걸음 + 추천 학습 순서
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무) N
        • 마이 정글(WIL, 에세이) N
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 3장 완전 정복] 3.3 데이터는 메모리에 어떻게 저장될까?
상단으로

티스토리툴바