초안 : GGWABaeGi @김민수

2024년 6월 14일 오전 12:00 (GMT+9)

엔디언

엔디언(Endianness)은 컴퓨터 시스템에서 멀티바이트 데이터를 메모리에 저장하거나 전송할 때 바이트의 순서를 정의하는 방식입니다. 주로 두 가지 방식이 있습니다: 리틀 엔디언(Little Endian)과 빅 엔디언(Big Endian).

1. 엔디언 개념 설명

리틀 엔디언 (Little Endian)

리틀 엔디언 방식에서는 데이터의 하위 바이트(Least Significant Byte, LSB)가 메모리의 낮은 주소에 저장됩니다. 즉, 숫자의 가장 작은 단위가 먼저 저장됩니다. 이 방식은 인텔 x86 계열의 프로세서에서 주로 사용됩니다.

예를 들어, 4바이트 정수 0x12345678을 리틀 엔디언 방식으로 메모리에 저장하면 다음과 같이 저장됩니다:

주소: 0x00 0x01 0x02 0x03
값: 0x78 0x56 0x34 0x12

빅 엔디언 (Big Endian)

빅 엔디언 방식에서는 데이터의 상위 바이트(Most Significant Byte, MSB)가 메모리의 낮은 주소에 저장됩니다. 즉, 숫자의 가장 큰 단위가 먼저 저장됩니다. 이 방식은 네트워크 프로토콜과 일부 RISC 프로세서에서 주로 사용됩니다.

예를 들어, 4바이트 정수 0x12345678을 빅 엔디언 방식으로 메모리에 저장하면 다음과 같이 저장됩니다:

주소: 0x00 0x01 0x02 0x03
값: 0x12 0x34 0x56 0x78

2. 구체적인 예시

다음은 C++로 리틀 엔디언과 빅 엔디언을 확인하고 변환하는 예제


// 엔디언을 확인하는 함수
bool isLittleEndian() {
 uint16_t number = 0x1;
 uint8_t *bytePtr = reinterpret_cast<uint8_t*>(&number);
 return (bytePtr[0] == 0x1);
}

// 엔디언 변환 함수 (리틀 엔디언 <-> 빅 엔디언)
uint32_t swapEndian(uint32_t num) {
 return ((num >> 24) & 0x000000FF) |
 ((num >> 8) & 0x0000FF00) |
 ((num << 8) & 0x00FF0000) |
 ((num << 24) & 0xFF000000);
}

int main() {
 uint32_t num = 0x12345678;

 std::cout << "Original number: 0x" << std::hex << num << std::endl;

 if (isLittleEndian()) {
 std::cout << "System is Little Endian" << std::endl;
 } 
 else {
 std::cout << "System is Big Endian" << std::endl;
 }

 uint32_t swappedNum = swapEndian(num);
 std::cout << "Swapped number: 0x" << std::hex << swappedNum << std::endl;

 return 0;
}

설명