빅 엔디안과 리틀 엔디안은 컴퓨터 메모리에 저장된 바이트들의 순서를 설명하는 용어이다.
컴퓨터에서는 어떤 크기의 데이터를 메모리에 저장할 때 바이트 단위로 나누어 저장하는데,
이러한 방식을 바이트 오더(Byte Order)라고 한다.


[그림] 레지스터와 메모리 위치 매핑관계, 출처 : 위키피디아(www.wikipedia.org)




리틀-엔디안 (Little-Endian)

낮은(시작) 주소에 하위 바이트부터 기록, Intel CPU 계열
예) 32비트형 (4바이트) 값: 0x01020304

하위 주소0x040x030x020x01상위 주소


빅-엔디안 (Big-Endian)

낮은(시작) 주소에 상위 바이트부터 기록, Sparc / RISC CPU 계열
예) 32비트형 (4바이트) 값: 0x01020304

하위 주소0x010x020x030x04상위 주소


※ 0x는 16진수를 나타내는데, 16진수는 각 자리당 0~F(16개)로 표현한다.

각 자리당 16개를 나타낼 수 있으므로 4비트가 필요하다. (2^4=16)

따라서 1byte는 8bit니까 바이트씩 끊어 저장하면 2개씩 저장된다.





리틀-엔디안 (Little-Endian)을 사용하는 이유


빅엔디안은 우리 눈으로 보기 쉽지만,  ALU(산술연산유닛)에서 메모리를 읽는 방식이

메모리 주소가 낮은 쪽 ㅡ> 높은 쪽으로 읽기 때문에 리틀엔디안을 사용하면 산술연산 수행이 더 쉽다.




■ 리틀-엔디안, 빅-엔디안을 맞춰주어야 하는 이유 


네트워크 프로그래밍에서 데이터를 다른 시스템으로 전송할 때

서로 다른 데이터 저장 방식의 시스템 끼리 통신하게 되면 전혀 엉뚱한 값을 주고 받을 수 있기 때문이다.


소켓은 기본적으로 빅엔디안으로 통일되어 있다.



■ 예제



#include <stdio.h>

int main()
{
        int inum = 0x12345678;     ㅡ> 16진수 12345678 저장

        unsigned char *p;          ㅡ> 포인터변수 생성

        p = (unsigned char*)&inum; ㅡ> 변수 inum 의 주소를 p 에 저장


        printf("%08X\n",inum);     ㅡ> inum의 값 12345678 출력

        printf("%p\n",&inum);      ㅡ> inum의 주소 0xbfd256ec 출력



        printf("%p\n",p);          ㅡ> p에 저장된 값(inum의 주소) 0xbfd256ec 출력

        printf("%02X\n",*p);       ㅡ> p에 저장된 값(주소)가 가르키는 값 처음 2자리 78 출력



        ++p;                       ㅡ> p에 저장된 값 (inum의 주소) 증가

        printf("%p\n",p);          ㅡ> 0xbfd256ed

        printf("%02X\n",*p);       ㅡ> 56



        ++p;

        printf("%p\n",p);          ㅡ> 0xbfd256ee

        printf("%02X\n",*p);       ㅡ> 34



        ++p;

        printf("%p\n",p);          ㅡ> 0xbfd256ef

        printf("%02X\n",*p);       ㅡ> 12



        return 0;

} 



예제를 통해 역순으로 출력되는 것을 보아 리틀-엔디안이다.




■ 후기


틀린 것 있으면 수정좀 부탁드립니다.



■ 출처


https://firejune.com

http://forum.falinux.com/

http://andrew0409.tistory.com/105

'전공과목 > Network' 카테고리의 다른 글

동기와 비동기 & 블록킹과 논블록킹 정리  (0) 2016.11.26
OSI 7 Layer [OSI 7 계층]  (0) 2016.10.18

+ Recent posts