초안 : GGWABaeGi @김민수
2024년 6월 14일 오전 12:00 (GMT+9)
엔디언(Endianness)은 컴퓨터 시스템에서 멀티바이트 데이터를 메모리에 저장하거나 전송할 때 바이트의 순서를 정의하는 방식입니다. 주로 두 가지 방식이 있습니다: 리틀 엔디언(Little Endian)과 빅 엔디언(Big Endian).
리틀 엔디언 방식에서는 데이터의 하위 바이트(Least Significant Byte, LSB)가 메모리의 낮은 주소에 저장됩니다. 즉, 숫자의 가장 작은 단위가 먼저 저장됩니다. 이 방식은 인텔 x86 계열의 프로세서에서 주로 사용됩니다.
예를 들어, 4바이트 정수 0x12345678을 리틀 엔디언 방식으로 메모리에 저장하면 다음과 같이 저장됩니다:
주소: 0x00 0x01 0x02 0x03
값: 0x78 0x56 0x34 0x12
빅 엔디언 방식에서는 데이터의 상위 바이트(Most Significant Byte, MSB)가 메모리의 낮은 주소에 저장됩니다. 즉, 숫자의 가장 큰 단위가 먼저 저장됩니다. 이 방식은 네트워크 프로토콜과 일부 RISC 프로세서에서 주로 사용됩니다.
예를 들어, 4바이트 정수 0x12345678을 빅 엔디언 방식으로 메모리에 저장하면 다음과 같이 저장됩니다:
주소: 0x00 0x01 0x02 0x03
값: 0x12 0x34 0x56 0x78
다음은 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;
}