Byte Order는 1차원 컴퓨터 메모리 공간에 여러 개의 연속된 데이터를 저장하는 방법으로, 저장 순서에 따라 리틀 엔디언(Little-endian), 빅 엔디언(Big-endian)이 있으며, 두 경우에 속하지 않거나 둘 모두를 지원하는 미들 엔디언(Middle-endian)이 있다.

 

 

[리틀 엔디언(Little-endian)]

메모리의 낮은 주소에 낮은 바이트(LSB, Least Significant Bit)부터 저장하는 방식이다. x86 아키텍처 기반 CPU, ARM 아키텍쳐 등은 리틀 엔디언 방식을 사용하고 있다. 

 

 

[빅 엔디언(Big-endian)]

메모리의 낮은 주소에 높은 바이트(MSB, Most Significant Bit)부터 저장하는 방식이다. IBM Power PC 아키텍쳐 계열, HP 아키텍쳐 계열의 경우 빅 엔디언 방식을 사용한다. 

 

 

[저장 방식의 차이]

 

리틀 엔디언과 빅 엔디언은 저장 방식의 차이일 뿐, 어떤 것이 더 우수한지에 대해 판단할 필요는 없다. 하지만 어느정도의 차이는 존재한다.

 

1. 가산기 처리 방식

가산기 덧셈 과정은 LSB부터 시작하여 자리 올림을 계산하기 때문에, 첫 번째 byte가 LSB인 리틀 엔디언에서는 가산기 설계가 단순해진다. 빅엔디언은 이 구조에 대해 메모리 순서가 반대이기 때문에 역방향 계산을 진행해야 한다. 하지만 이러한 차이도 현 시대의 프로세서의 경우 여러 개의 byte를 동시에 읽어들여 계산을 진행할 수 있기 때문에 의미있는 차이는 아니다.

 

2. 형변환

저장된 값의 하위 비트만 사용할 경우, 별도의 계산이 필요 없다. 리틀 엔디안으로 0x2A를 표현하면 2A 00 00 00이 된다. 이 표현에서 앞의 2byte, 또는 1byte만 때어내면 하위 16bit, 또는 8bit를 바로 얻을 수 있다. 반면 빅 엔디언의 경우 하위 16bit, 8bit를 얻기 위해서는 주소에 2byte 또는 3byte를 더해야하기 때문에 리틀 엔디언에 비해 추가 계산이 필요하다.

 

3. 수의 비교

빅 엔디언은 숫자 비교를 MSB부터 차례대로 진행하기 때문에 숫자를 비교할 때 큰 이점이 있다. 네트워크에서는 속도가 우선시되기 때문에 네트워크 프로그래밍에서 빅 엔디언을 주로 활용하는 이유가 바로 이것이다.

 

4. 기타

그래도 네트워크 프로토콜, 파일 포멧과 같이 저수준으로 내려가면 bit단위를 LSB부터 채울 것인지, MSB부터 채울 것인지는 항상 문제가 된다.

 

예를 들어, C는 struct에서 byte보다 더 작은 단위의 변수를 선언할 수 있는 bit field를 지원하는데, 여러 개의 bit field가 배열되는 방법은 기계어를 생성하는 과정에서 중요해진다. 이때 MSB부터 채우는 것을 최상위비트우선, LSB부터 채우는 것을 최하위비트우선이라고 한다. PNG는 최상위비트우선, GIF는 최하위비트우선 파일 포멧의 대표적 예시이다.

+ Recent posts