엔디안(Endianness)이란 무엇인가?
이진 파일과 데이터 관리 분야에서 엔디안(Endianness)은 컴퓨터 메모리 내부에 디지털 데이터의 바이트가 저장되는 순서를 의미합니다. 하나의 정수나 실수 값은 여러 개의 바이트로 구성되는데, 이 바이트들을 메모리에 어떤 순서로 배치할지는 시스템 아키텍처마다 다를 수 있습니다.
컴퓨터 메모리에는 크게 두 가지 엔디안 방식이 존재합니다.
1. 빅 엔디안(Big-Endian)
빅 엔디안 시스템은 데이터의 최상위 바이트(Most Significant Byte)를 먼저 저장합니다. 사람이 숫자를 읽는 방식과 유사하여 직관적이라는 장점이 있으며, 네트워크 전송 시 표준으로 사용되는 '네트워크 바이트 순서'도 빅 엔디안입니다.
2. 리틀 엔디안(Little-Endian)
리틀 엔디안 시스템은 데이터의 최하위 바이트(Least Significant Byte)를 먼저 저장합니다. Intel x86 및 대부분의 ARM 프로세서가 이 방식을 사용하며, 저급 바이트부터 처리할 수 있어 산술 연산에서 효율적입니다.
바이트 저장 순서 예시
16진수 값 0x12345678(4바이트)을 메모리 주소 0x1000번지부터 저장한다고 가정하면 다음과 같습니다.
빅 엔디안: 0x1000 → 12, 0x1001 → 34, 0x1002 → 56, 0x1003 → 78
리틀 엔디안: 0x1000 → 78, 0x1001 → 56, 0x1002 → 34, 0x1003 → 12
C++에서 엔디안이 중요한 이유
C++로 이진 파일을 읽거나 쓸 때, 파일을 생성한 시스템과 파일을 읽어 들이는 시스템의 엔디안이 다르면 데이터가 뒤집혀 해석될 수 있습니다. 따라서 서로 다른 플랫폼 간에 이진 데이터를 교환할 때는 반드시 바이트 순서를 확인하고, 필요하다면 htonl(), ntohl() 같은 함수나 직접 구현한 바이트 스왑 로직을 활용해 일관성을 유지해야 합니다.