컴퓨터 메모리에서 데이터 저장순서? - 빅엔디안과 리틀엔디안

 

  바이트 오더링을 아십니까? 이는 "바이트단위로 순서를 세운다"라고 생각하시면 되는데요. 바이트 오더(Byte Order)하면 가장 먼저 떠오르는 두 가지가 빅 엔디안과 리틀 엔디안일 것 입니다. 많이 헷갈릴 수 있는 부분입니다. 프로그래밍을 하는 사람이라면 빅 엔디안과 리틀 엔디안 방식의 개념은 당연히 알아야할 요소라고 생각됩니다.

 

  빅 엔디안(Big-Endian)과 리틀 엔디안(Little-Endian)이라는 말은 조나단 스위프트의 걸리버 여행기에서 유래했습니다. 삶은 달걀은 둥근 쪽과 뾰족한 쪽이 있습니다. 둥근 쪽은 면적이 상대적으로 큰끝(big end)이고 뾰족한쪽은 면적이 작은끝(little end)입니다. 그리하여 소인국에선 둥근 쪽을 깨서 먹는 사람(Big Endian)과 뾰족한 쪽을 깨서 먹는 사람(Little Endian)으로 나누어 어느 쪽을 먼저 깨먹어야 하느냐에 대하여 대립을 벌이는데서 비롯 되었다고 합니다.

 

빅 엔디안 (Big-Endian)

- unix를 사용하는 RISC processor 계열에서 사용하는 Byte Ordering입니다.

- network protocol에서 표준으로 사용하는 Byte Ordering이기도 합니다.

- 메모리 시작 주소에 상위 바이트부터 기록합니다.

 

리틀 엔디안 (Little-Endian)

- intel계열의 processor에서 사용하는 바이트 오더링 입니다.

- 메모리 시작주소에 하위 바이트부터 기록합니다.

-------------------------------------------------------------------------------------------

우선 쉽게 설명하자면 87453489라는 정수가 있다고 칩시다. 이를 int형 4byte의 메모리에 저장할 때

* Big-Endian 저장방식 : 87 45 34 89

* Little-Endian 저장방식 : 89 34 45 87

이런 식으로 저장합니다.

 

  이렇게 87 45 34 89가 총 4byte로 1byte씩 순서에 따라 저장되기 때문에 빅-리틀 엔디안을 byte ordering이라 합니다. 바이트단위로 순서에 따르기때문이죠.

 그런데 Big은 원래의 수를 1byte씩 나눠 순서대로 저장했지만, little은 원래의 수를 1byte 단위로 나눠 거꾸로 저장했네요? 하지만 1byt단위 내에서는 순서가 그대로입니다. 이 부분이 중요합니다.

 

-------------------------------------------------------------------------------------------

    MSB와 LSB로 이해해보자!!!

 

  MSB (Most Significant Bit), LSB (Least Significant Bit) 참 어려워 보이는 말입니다. 하지만 그리 어렵지않습니다.  용어만 생겻을 뿐이지 위의 쉬운 설명에서 크게 벗어나지 않습니다. 그리고 메모리주소 값의 개념만 있다면 용어에 상관없이 이해하실 수 있습니다.

* MSB - Most Significanct Bit (가장 큰 비트 자릿수, 최상위비트)

* LSB - Least Significant Bit (가장 작은 비트 자릿수, 최하위비트)

입니다.

 

  맨위에서 설명하기 앞서 Big-Endian은 메모리 시작 주소에 상위 바이트부터 기록하고, Little-Endian은 메모리 시작주소에 하위 바이트부터 기록한다고 했습니다. 아래 그림을 봅시다.

12345678 이라는 숫자가 있습니다. 이 숫자의 MSB(최상위 비트)가 포함된 숫자는 1입니다. 물론론 최상위 비트가 1인것을 아닙니다. 하지만 최상위 bit가 속한 수는 1이란것을 알수있습니다. 그리고 최상위 bit가 속한 byte단위의 수는 12 입니다. 그럼 최하위 bit인 LSB가 포함된 수는 8입니다. 물론 최하위 bit가 포함된 byte단위의 수는 78 입니다.

 

  왜 최상위bit가 포함된 byte단위수라고 할까요? 복잡하게시리... 그 해답은 bit에 있습니다.

 

12345678을 한글자씩 끊어서 bit로 표현해봅시다.

 

0001 0010 0011 0100 0101 0110 0111 1000

  1    2    3     4    5    6    7     8

여기서 0가  MSB, 0LSB인것입니다. 그리고 byte단위로 끊는다면 12/34/56/78 이기 때문에 MSB, LSB가 포함된 byte단위수라는 표현을 사용했던 것입니다.

 

  이제 나머지는 위의 설명들을 종합해서 자신의 머릿속에서 정리하는것에 달렷습니다.

--------------------------------

 가끔 byte ordering, bit ordering에 대한 말들이 bit ordering은 왜 빅엔디안방식만 따르는가? 에 대해 생각하는데 1번 힌트는 bit ordering은 bit단위로 순서를 세운다. 2번 힌트 bit단위(2진수)로 거꾸로 세워서 다시 10진수로 고쳐보자.

 

그리고 무엇보다 엔디안(endian)이라는 말은 byte ordering에 대해서만 쓰이는것이지 bit order로는 생각하면안된다고 생각됩니다.

 

출처 - http://blog.naver.com/duehd88/20163866392

'Programing > programing note' 카테고리의 다른 글

CRUD는 무엇인가?  (0) 2015.12.06
ip에 대해서  (0) 2015.02.17
졸업작품 뒤죽박죽 개발일지  (0) 2014.10.04
parameter(파라미터)와 argument(아규먼트)  (0) 2014.06.29
Posted by duehd88
,