---
title: "엔디언: 0x12345678은 메모리에 어떤 순서로 놓일까"
author: "Lee"
published_at: "2026-10-07T11:58:03.101Z"
updated_at: "2026-09-30T09:54:37.302Z"
tags: ["컴퓨터공학","컴퓨터구조"]
canonical_url: "https://ariser.io/@writer_a1cd615ab19e/%EC%97%94%EB%94%94%EC%96%B8-0x12345678%EC%9D%80-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%97%90-%EC%96%B4%EB%96%A4-%EC%88%9C%EC%84%9C%EB%A1%9C-%EB%86%93%EC%9D%BC%EA%B9%8C"
ai_assisted: false
---

# 엔디언: 0x12345678은 메모리에 어떤 순서로 놓일까

[원문](https://ariser.io/@writer_a1cd615ab19e/%EC%97%94%EB%94%94%EC%96%B8-0x12345678%EC%9D%80-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%97%90-%EC%96%B4%EB%96%A4-%EC%88%9C%EC%84%9C%EB%A1%9C-%EB%86%93%EC%9D%BC%EA%B9%8C)

여러 바이트로 표현하는 정수를 메모리에 저장할 때 바이트의 순서를 정해야 한다. 엔디언은 이 순서에 관한 규칙이다. 빅 엔디언은 더 중요한 바이트를 낮은 주소에 두고, 리틀 엔디언은 덜 중요한 바이트를 낮은 주소에 둔다. 숫자의 수학적 값은 같지만 메모리의 바이트를 주소 순서대로 보면 배열이 다르게 나타난다.

![값 0x12345678이 주소 증가 순서로 빅 엔디언에서는 12·34·56·78, 리틀 엔디언에서는 78·56·34·12로 저장되는 그림](/api/v1/media/8ba4daee-f762-49e5-8a5e-19a36ce26bdd)

*엔디언은 여러 바이트 값의 저장 순서이며 바이트 안의 비트 순서와 구분된다.*

## 주소가 커지는 방향으로 읽는다

32비트 값 0x12345678은 네 바이트 12, 34, 56, 78로 나눌 수 있다. 빅 엔디언에서는 주소 p, p+1, p+2, p+3에 각각 12, 34, 56, 78이 놓인다. 리틀 엔디언에서는 78, 56, 34, 12가 놓인다. 각각의 바이트 안 비트 순서까지 거꾸로 뒤집는다는 뜻은 아니다. 바이트 순서와 비트 전송 순서는 구분해야 한다.

숫자를 정상적인 정수 읽기로 가져오면 CPU는 자신의 규칙에 맞춰 같은 값을 해석한다. 차이는 메모리 덤프를 보거나 다른 환경으로 바이트를 전달할 때 드러난다. 한쪽이 78, 56, 34, 12를 보냈는데 다른 쪽이 이를 빅 엔디언 32비트 정수로 해석하면 0x78563412가 된다. 전달한 바이트는 같아도 해석 계약이 달랐던 것이다.

## 외부 형식은 명시적으로 정한다

네트워크 프로토콜과 파일 형식은 저장 순서를 명확히 정해야 한다. 전통적인 인터넷 프로토콜에서 말하는 네트워크 바이트 순서는 빅 엔디언이다. [Linux의 byteorder 문서](https://man7.org/linux/man-pages/man3/byteorder.3.html)는 호스트 순서와 네트워크 순서를 변환하는 함수를 설명한다. 하지만 모든 네트워크 메시지의 모든 필드가 자동으로 빅 엔디언인 것은 아니며 해당 형식의 규격을 따라야 한다.

`htonl`처럼 정해진 폭의 값을 변환하는 함수를 쓰거나 바이트를 명시적으로 구성할 수 있다. 직접 구성한다면 폭이 맞는 부호 없는 정수에 시프트와 마스크를 적용하는 방법이 일반적이다. 이미 변환한 값을 다시 변환하거나 텍스트 숫자와 이진 정수를 혼동하면 이중 변환 오류가 생길 수 있다.

## 바이트 순서만 맞춰도 부족할 수 있다

자료구조 메모리를 통째로 파일에 쓰면 엔디언 외에도 패딩, 정렬, 필드 폭, 부동소수 형식, 포인터 값이 문제다. 같은 언어라도 컴파일러와 플랫폼 규약에 따라 배치가 달라질 수 있다. 직렬화 형식은 각 필드의 의미와 폭, 순서, 선택 항목을 명시해 프로그램 내부 메모리 배치와 분리하는 편이 이식성에 유리하다.

한 바이트 값은 바이트 순서를 바꿀 대상이 없다. 문자열도 인코딩에 따라 해석해야 한다. UTF-8 같은 바이트 흐름을 정수처럼 네 바이트씩 무조건 뒤집으면 텍스트가 깨진다. UTF-16 등 여러 바이트 코드 단위를 쓰는 형식에서는 바이트 순서를 구분할 필요가 있다. 데이터 종류를 먼저 확인하는 일이 변환 함수보다 앞선다.

리틀 엔디언과 빅 엔디언 중 하나가 수학적으로 올바르고 다른 하나가 틀린 것은 아니다. 서로 다른 편의와 역사적 선택이 있다. 중요한 것은 내부 표현을 외부 교환 형식으로 착각하지 않는 것이다. 엔디언을 이해하면 패킷 분석, 바이너리 파일, 저장 장치 덤프에서 값이 뒤바뀌어 보이는 문제를 정확히 찾을 수 있다.

### 참고 자료

- [Linux man-pages — byteorder(3)](https://man7.org/linux/man-pages/man3/byteorder.3.html)
