Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++의 엔디안 순서와 이진 파일 완벽 이해하기

엔디안(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() 같은 함수나 직접 구현한 바이트 스왑 로직을 활용해 일관성을 유지해야 합니다.