프로그래밍을 하다 보면 데이터를 파일로 저장하거나, 네트워크를 통해 전송할 때 바이트 단위로 데이터를 다뤄야 할 때가 있습니다. 이때 중요한 개념 중 하나가 바로 앤디안(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*)#
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 언어처럼 메모리를 직접 다룰 수 있는 언어를 사용할 때는 앤디안 차이로 인해 발생할 수 있는 버그를 조심해야 해요.
'C언어' 카테고리의 다른 글
| C언어에서 *값과 &값의 차이 (0) | 2025.07.08 |
|---|---|
| C언어의 구조체 vs Java의 클래스: 비교 (0) | 2025.07.07 |
| C 언어에서의 역참조 연산자와 포인터 변수의 구분 (0) | 2025.07.07 |
| C언어 문자열 관련 함수 (0) | 2025.04.11 |