'바이트오더'에 해당되는 글 1건

  1. 2007.11.05 리틀엔디안(little endian) vs 빅엔디안(big endian)

리틀엔디안(little endian) vs 빅엔디안(big endian)

개발 2007. 11. 5. 14:34

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

저자 : hanburn

날짜 : 2007-11-05


이번에는 CPU가 메모리를 읽는 순서에 대해서 살펴 보도록 하겠습니다. 먼저 엔디언이란 여러 바이트로 되어있는 자료를 하나의 데이터로 간주하여 어떤 바이트 순서로 데이터를 배열 할 것인지를 나타내는 것입니다. 주소가 낮은쪽에 최하위 바이트를 저장하는 방식을 리틀 엔디안(Little-endian) 이라 하고, 반대로 낮은쪽에 최상휘 바이트를 저장하는 방식을 빅 엔디안(Big-endian)이라고 합니다.

 

이해하기 쉽게 예를 들면, long 타입의(32bit 환경에서 4byte) 데이터를 메모리에 쓴다고 할때

long a = 0x1234;

 

리틀엔디안 에서는          0x0012FED4  34 12 00 00

빅엔디안 에서는             0x0012FED4  00 00 12 34

 

위와 같은 구조로 메모리에 저장이 되게 됩니다.

 

빅엔디안은 우리가 평소에 보던 방식으로 메모리에 쓴다고 생각하면 되구요, 리틀엔디안은 뒤집어 져서 쓴다고 생각하며 됩니다. 그럼 리틀엔디안은 왜 뒤집어서 쓰는 걸까요??

 

그것은 산술연산유닛(ALU)에서 메모리를 읽는 방식이 메모리 주소가 낮은 쪽에서부터 높은 쪽으로 읽기 때문에 산술 연산의 수행이 더 쉽기 때문이랍니다. (~ 그렇군~)

 

우리가 사용하는 인텔(Intel)x86 계열의 CPU등은 리틀엔디언 방식의 CPU이구요, Motorola, Sun, Sparc 같은 Risc 타입은 빅엔디안 방식입니다.

 

빅엔디안 방식의 장점이라면,

정수로 정렬된 수에대한 비교가 메모리에서 읽는 순서대로 바로 비교가 가능

정수와 숫자타입의 데이터를 같은 순서 방향으로 읽을수 있음.

등이 되겠습니다.

 

보통 IBM 호환 컴퓨터의 Windows 환경을 많이 사용하고 있는데, 이때는 리틀엔디안의 방법으로 사용되고 있습니다. 그런데 네트워크는 네트워크 오더링 이라고 하여서 빅엔디안 방식의 바이트 정렬 방법을 사용하고 있는습니다. 따라서 통신 프로그램을 할 때는 이 바이트 정렬을 맞추어 주어야 합니다. C 함수로 ntohs, htons, ntohl, htonl 등의 함수를 이용하면 리틀엔디안과 빅엔디안 사이의 변환을 수행 할 수 있습니다.

 

위의 htonl 함수를 호출하기 전/후 메모리를 찍어 보면 아래와 같습니다.

 

long a = 0x1234;

a = htonl(a);

 

호출전: 0x0012FED4  34 12 00 00

호출후: 0x0012FED4  00 00 12 34

 

htonl ntohl 함수는 같은 실제적으로 같은 역할을(바이트 순서 변경) 하는데, 의미상 이름을 host to network, network to host로 해서 제공하고 있습니다.

 



: