C언어

컴퓨터에서 데이터가 저장되는 순서: 앤디안(Endian) 방식

초코너무조코 2025. 7. 9. 22:26
728x90

프로그래밍을 하다 보면 데이터를 파일로 저장하거나, 네트워크를 통해 전송할 때 바이트 단위로 데이터를 다뤄야 할 때가 있습니다. 이때 중요한 개념 중 하나가 바로 앤디안(Endian) 방식입니다.

앤디안이란?

앤디안(Endian) 은 컴퓨터가 멀티바이트 데이터(예: int, float 등) 를 메모리에 저장할 때 바이트를 어떤 순서로 나열할지를 정의하는 방식입니다.

앤디안은 크게 두 가지로 나뉩니다

  • 빅엔디안(Big Endian): 가장 중요한 바이트(MSB, Most Significant Byte)가 가장 앞에 저장됩니다.
  • 리틀엔디안(Little Endian): 가장 중요한 바이트가 가장 뒤에 저장되고, 덜 중요한 바이트부터 앞에 저장됩니다.

 

32비트 정수 0x12345678 을 메모리에 저장할 때

  • 빅엔디안: 12 34 56 78
  • 리틀엔디안: 78 56 34 12

 

왜 앤디안이 중요할까?

같은 숫자라도 다른 시스템(예: 네트워크, 다른 CPU 아키텍처) 에서는 바이트 순서가 다를 수 있습니다. 예를 들어, x86 아키텍처는 리틀엔디안 방식을 사용하지만, 네트워크 통신 규약에서는 빅엔디안을 표준으로 사용합니다. 그래서 데이터를 주고받을 때 올바른 순서를 맞춰줘야 합니다.

C 언어 예제로 알아보는 앤디안

간단한 C 프로그램을 통해 현재 시스템이 어떤 앤디안 방식을 사용하는지 확인해볼 수 있습니다.

#include <stdio.h>

int main() {
    unsigned int num = 0x12345678;
    unsigned char *ptr = (unsigned char*)&num;

    printf("Memory representation: ");
    for (int i = 0; i < sizeof(num); i++) {
        printf("%02X ", ptr[i]);
    }
    printf("\n");

    if (ptr[0] == 0x78) {
        printf("이 시스템은 리틀엔디안입니다.\n");
    } else if (ptr[0] == 0x12) {
        printf("이 시스템은 빅엔디안입니다.\n");
    } else {
        printf("알 수 없는 엔디안 방식입니다.\n");
    }

    return 0;
}

출력 예시 (x86 시스템에서 실행 시):

Memory representation: 78 56 34 12
이 시스템은 리틀엔디안입니다.

앤디안 변환 함수

C 표준 라이브러리에는 앤디안 변환을 위한 함수가 기본적으로 포함되어 있지 않지만, POSIX 시스템에서는 htons, htonl, ntohs, ntohl 등의 함수를 사용할 수 있습니다.

이 함수들은 "Host to Network" 또는 "Network to Host" 라는 뜻으로, 리틀엔디안 시스템에서 네트워크용 빅엔디안으로 변환하거나 그 반대 작업을 도와줍니다.

예:

#include <arpa/inet.h>

unsigned int host_to_network = htonl(0x12345678);

마무리

앤디안은 평소에는 잘 드러나지 않지만, 시스템 간의 데이터 교환, 파일 포맷 처리, 저수준 메모리 조작 등에서 꼭 알아야 할 개념입니다. 특히 C 언어처럼 메모리를 직접 다룰 수 있는 언어를 사용할 때는 앤디안 차이로 인해 발생할 수 있는 버그를 조심해야 해요.

 

728x90