컴퓨터가 데이터를 기억하는 두 가지 방법
컴퓨터는 모든 데이터를 0과 1로 처리하지만, 메모리에 저장할 때는 바이트(Byte) 단위로 나누어 저장힙니다. 데이터가 1바이트라면 상관없지만, 4바이트(32bit)나 8바이트(64bit)처럼 여러 바이트로 이루어진 데이터를 저장할 때는 "어떤 바이트부터 먼저 저장할 것인가?"에 대한 약속이 필요합니다.
이 순서를 바이트 저장 순서(Byte Order)라고 하며 크게 빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian)으로 나뉩니다.
큰 쪽이 먼저냐, 작은 쪽이 먼저냐
이 두가지 방식의 가장 큰 차이는 데이터의 상위 바이트(MSB, 가장 큰 값)를 메모리의 낮은 주소(앞쪽)에 두느냐, 높은 주소(뒤쪽)에 두느냐에 있습니다.
예를 들어, 0x12345678이라는 4바이트 데이터를 저장한다고 가정합니다.
- 상위 바이트 (MSB):
0x12(가장 큰 자리) - 하위 바이트 (LSB):
0x78(가장 작은 자리)
- 빅 엔디안 (Big Endian)
- 방식: 상위 바이트(큰 쪽, MSB)를 낮은 메모리 주소(앞)부터 저장
- 특징: 우리가 숫자를 읽고 쓰는 순서(왼쪽 -> 오른쪽)와 같아서 사람이 보기에 직관적임
- 디버깅: 메모리 값을 덤프(Dump) 떠서 볼 때, 순서 그대로 읽으면 되기 때문에 디버깅이 편리함
- 리틀 엔디안 (Little Endian)
- 방식: 하위 바이트(작은 쪽, LSB)를 낮은 메모리 주소(앞)부터 저장
- 특징: 데이터의 순서가 뒤집혀서 저장되어 사람이 읽으려면 거꾸로 계산해야 함
| 메모리 주소 | 빅 엔디안 (Big Endian) | 리틀 엔디안 (Little Endian) |
|---|---|---|
0x100 (낮은 주소) | 12 (MSB) | 78 (LSB) |
0x101 | 34 | 56 |
0x102 | 56 | 34 |
0x103 (높은 주소) | 78 (LSB) | 12 (MSB) |
- 빅 엔디안:
12 34 56 78(순서대로) - 리틀 엔디안:
78 56 34 12(역순으로)
어디서 무엇을 사용할까?
어느 방식이 기술적으로 우위에 있는 것은 아니며 역사적인 이유와 아키텍처의 특성에 따라 사용처가 갈림
데스크톱 & 서버 (x86 아키텍처): 리틀 엔디안
윈도우나 리눅스 환경에서 메모리를 직접 까보면 데이터가 거꾸로 뒤집혀 있는 것을 볼 수 있음
네트워크 프로토콜: 빅 엔디안
반면, 네트워크는 빅 엔디안이 표준이며 이를 네트워크 바이트 오더라고도 부름
- 이유: 역사적으로 라우팅이 전화번호를 거는 식(앞자리 부터)으로 이루어져 상위 바이트를 먼저 전송하고 처리하는 것이 유리했음
- 이 때문에 네트워크 프로그래밍을 할 때는 내 컴퓨터(리틀 엔디안)의 데이터를 네트워크(빅 엔디안)로 보낼 때 순서를 뒤집어주는 변환 과정이 필수적임