카테고리 없음

리틀 엔디안 빅 엔디안

great-artist 2011. 7. 9. 19:11

리틀 엔디안, 빅 엔디안 이란 무엇일까?

 메모리의 저장단위는 8비트로 이루어진 바이트입니다. 프로그래밍시 사용하는 byte, short, int 등등이
메모리에 저장될때 어떤 방식으로 저장되는가에 따라 리틀엔디안과, 빅 엔디안으로 구분됩니다.


구체적으로 어떻게 저장된다는 거지?

설명보다는 예를 먼저 보는게 이해가 빠를거 같습니다. 숫자 255는 16진수로 0xff 입니다.
32비트 운영체제에서 int는 4바이트입니다..,.

int var = 255;

 비쥬얼 스튜디오에서 해당 변수에 마우스를 갖다대어서 값을 확인해보면 0x000000ff 의 값이
보입니다... 32비트 환경에서 int는 4바이트이기에 값이 제대로 보이는거 같습니다.
하지만 실제 메모리 상에서 저장되어진 모습은 다릅니다.

 먼저 빅엔디안 방식에서 var 변수가 메모리에 어떻게 저장되어 있는지 모습을 볼까요?
아래와 같이 메모리의 주소번지가 낮은곳 부터 높은 메모리 주소 번지로 값이 쓰인 것을
확인할 수 있습니다.

주소번지  1000  1001  1002  1003
 0x00  0x00  0x00  0xff


 그럼 리틀 엔디안의 모습을 보겠습니다. 리틀엔디안은 메모리상의 높은 번지에서 낮은 번지로
값이 쓰입니다.쉽게 이해하려면 역순으로 저장된다고 생각하시면 편할꺼 같습니다.

 주소번지  1000  1001  1002  1003
 값  0xff  0x00  0x00  0x00


두 방식의 차이점이 보이시나요?


차이점은 어디에서 오는 것일까?

주변에서 흔히 쉽게 볼수 있는 인텔 계열 cpu는 메모리에 데이터 저장시 리틀엔디안을 씁니다.



두가지 방식의 차이점을 언제 고려해야 할까?

 사실 메모리에 저장되는 방식은 리틀엔디안이든 빅엔디안이든 다시 읽어 들일때는 본래의
모습으로 변환되기 때문에 신경쓰지 않아도 됩니다. 하지만 메모리를 직접 액세스 해서 디버깅을
할때 메모리에 역순으로 저장되어 있음을 알고 있어야 합니다.

 또 다른 경우는 타기종간의 네트워크 통신을 할때 문제가 발생합니다. 한쪽은 리틀엔디안이고
다른 쪽은 빅엔디안이면 서로간의 메모리를 해석하는 방법이 달라서 문제가 발생할 수 있습니다.

A라는 컴퓨터가 빅엔디안 방식이고 B라는 컴퓨터가 리틀엔디안 방식이라 했을경우
 
A가 숫자 255( 0x000000ff ) 를 보내면서 아래와 같은 데이터를 보냅니다.
0x00 0x00 0x00 0xff

 B라는 컴퓨터는 해당 메모리를 0xff000000 라는 의미로 해석합니다. 즉 값이
255를 보냈지만 4278190080 란 값으로 변했습니다. 의도하지 않은 의미로 변경되었습니다.

 네트워크상의 표준데이터 방식은 빅엔디안 방식입니다. 네트워크로 패킷을 내보내기전에
빅엔디안 방식으로 변경해 주어야하며 받은 측에서 본인에 맞는 방식으로 변경해서 사용하면
됩니다.