Endianness란? Big-Endian과 Little-Endian의 차이

Endianness란 무엇인가

컴퓨터는 데이터를 메모리에 저장할 때 여러 개의 바이트(byte)를 사용합니다. 예를 들어 4바이트 정수 하나를 저장하려면 메모리 주소 4칸이 필요합니다. 그런데 이 여러 바이트 중 어떤 것을 먼저(낮은 주소에) 저장할지에 대한 순서 규칙을 Endianness(엔디언)라고 합니다. 즉, 엔디언은 ‘숫자를 이루는 바이트들을 메모리에 어떤 순서로 배열할 것인가’에 대한 약속입니다.

이를 책의 페이지 번호에 비유할 수 있습니다. 어떤 책은 1페이지부터 순서대로 앞에서 읽고, 어떤 책은 뒤에서부터 거꾸로 읽는 방식이라고 생각하면 이해하기 쉽습니다. 데이터 값은 같아도 저장하는 ‘순서’만 다를 뿐입니다.

Big-Endian과 Little-Endian의 동작 차이

대표적인 방식은 두 가지입니다.

  • Big-Endian: 가장 큰 자릿수(상위 바이트, MSB)부터 낮은 메모리 주소에 저장합니다. 사람이 숫자를 읽는 방식과 비슷해서 직관적입니다.
  • Little-Endian: 가장 작은 자릿수(하위 바이트, LSB)부터 낮은 메모리 주소에 저장합니다. 대부분의 x86, x86-64 CPU가 이 방식을 사용합니다.

예를 들어 16진수 숫자 0x12345678을 메모리에 저장한다고 가정해봅시다. 메모리 주소가 0번지부터 3번지까지 있다면 다음과 같이 저장됩니다.

  • Big-Endian: 0번지 = 12, 1번지 = 34, 2번지 = 56, 3번지 = 78
  • Little-Endian: 0번지 = 78, 1번지 = 56, 2번지 = 34, 3번지 = 12

즉 같은 값이라도 바이트가 저장되는 순서가 정반대입니다. 참고로 ARM 계열 CPU는 설정에 따라 두 방식을 모두 지원하는 바이엔디언(bi-endian) 구조를 갖기도 합니다.

실무에서 왜 중요한가

평소 애플리케이션 개발에서는 엔디언을 신경 쓸 일이 거의 없습니다. CPU와 컴파일러가 알아서 처리해주기 때문입니다. 하지만 다음과 같은 상황에서는 반드시 고려해야 합니다.

  • 네트워크 통신: TCP/IP 프로토콜은 Big-Endian을 표준(Network Byte Order)으로 사용합니다. Little-Endian 시스템에서 데이터를 전송할 때는 htons(), htonl() 같은 함수로 변환해야 합니다.
  • 파일 포맷 및 바이너리 데이터 파싱: 이미지 파일이나 프로토콜 스펙에 명시된 엔디언 방식을 지키지 않으면 데이터가 깨져 보입니다.
  • 크로스 플랫폼 개발: 서로 다른 CPU 아키텍처 간 데이터를 주고받을 때 엔디언 불일치로 인한 버그가 발생할 수 있습니다.

결국 엔디언은 눈에 잘 띄지 않지만, 저수준 프로그래밍이나 네트워크 프로토콜을 다룰 때는 반드시 이해하고 있어야 하는 기본 개념입니다.

댓글 남기기