멈추지 않고 끈질기게

[컴퓨터공학] 엔디안(Endian) 본문

컴퓨터공학

[컴퓨터공학] 엔디안(Endian)

sam0308 2023. 3. 4. 11:41

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.

 

 

이번 포스팅에서는 레지스터에 값을 저장하는 방식인 엔디안에 대해 알아보겠습니다.

서론

 컴퓨터는 데이터를 1바이트 단위로 저장하지만, 실제로 코딩할때 쓰는 데이터들은 1바이트보다 큰 타입이 대부분입니다( 가장 흔하게 쓰는 int형만 해도 4바이트입니다). 따라서 데이터를 저장할 때 여러개의 1바이트로 저장하게 되는데, 이 순서에 따라 빅 엔디안(Big Endian)이나 리틀 엔디안(Little Endian)으로 구분합니다. 이러한 바이트를 저장하는 순서를 바이트 오더(Byte Order)라고 하며, 어떤 바이트 오더를 사용하는지는 CPU(제조사)에 따라 다릅니다.

 

빅 엔디안(Big Endian) vs 리틀 엔디안(Little Endian) 

 빅 엔디안은 낮은 주소에 상위 바이트부터 저장하는 방식입니다. 예를 들어 0x12345678을 저장할 경우 0x12, 0x34, 0x56, 0x78 순서로 저장됩니다. RISC 기반의 CPU들이 대부분 빅 엔디안 방식을 사용한다고 합니다.

 반면 리틀 엔디안은 낮은 주소에 하위 바이트부터 저장하는 방식입니다. 같은 예로 0x12345678을 저장한다면, 0x78, 0x56, 0x34, 0x12 순서로 저장됩니다. 대표적으로 Intel CPU가 리틀 엔디안 방식을 사용합니다.

 

그림 1. 빅 엔디안 vs 리틀 엔디안
그림 2. 리틀 엔디안(Little Endian)

 제 컴퓨터는 Intel CPU를 사용하기 때문에 SASM 프로그램을 통해 0x12345678로 초기화한 변수를 바이트 단위로 조사해보면 0x78, 0x56, 0x34, 0x12 순서, 즉 리틀 엔디안 방식으로 저장되어 있는 것을 확인할 수 있습니다.

 

장단점과 주의점

 빅 엔디안은 우리 눈에 익숙한 순서대로 저장하므로 가독성이 좋아 디버깅이 용이하다는 장점이 있습니다. 또한 다른 변수와 크기를 비교하는 경우, 상위 바이트부터 순서대로 저장되어 있으므로 저장된 순서 그대로 비교하면 되기에 비교 연산이 비교적 빠르다는 장점도 있습니다.

 반대로 리틀 엔디안은 형변환이 빅 엔디안에 비해 빠르다는 장점이 있습니다. 예를 들어 0x12345678 4바이트를 2바이트짜리 변수에 저장할 경우, 하위 2바이트만 필요하므로 리틀 엔디안 방식에서는 저장된 순서대로 2개 바이트를 저장하면 됩니다. 

 

 이러한 바이트 오더에 관한 내용을 알아야 하는 이유는 네트워크 통신 때문입니다. 내 컴퓨터 내에서 이루어지는 데이터의 연산은 같은 CPU에 의해 이루어지므로 아무 문제가 없지만, 다른 컴퓨터와 통신하는 경우 바이트 오더가 다르면 문제가 발생합니다. 데이터를 전송하는 쪽과 전송받는 쪽의 바이트 오더가 다르다면 예상과 전혀 다른 결과가 나오기 때문입니다.

그림 3. 다른 바이트 오더 간 통신

  위 그림처럼 리틀 엔디안 방식의 PC에서 빅 엔디안 방식을 사용하는 PC에 별다른 변환 없이 데이터를 전송할 경우, 의도치 않은 데이터가 전송되는 결과를 낳게 됩니다. 이러한 혼동을 막기 위해 네트워크 바이트 오더는 빅 엔디안만을 사용합니다. 즉, 리틀 엔디안을 사용하는 컴퓨터에서 네트워크 통신을 할 경우 데이터 전송 시 빅 엔디안으로 변환하는 과정을 거쳐야 하며, 데이터 수신 시 리틀 엔디안에 맞는 순서로 조합할 필요가 있습니다. C++등의 프로그래밍 언어에서 이미 바이트 오더 변환을 위한 함수를 제공하고 있으며, 이에 관한 내용은 추후 포스팅에서 다루도록 하겠습니다.