[그림] 레지스터와 메모리 위치 매핑관계, 출처 : 위키피디아(www.wikipedia.org)
리틀-엔디안 (Little-Endian)
낮은(시작) 주소에 하위 바이트부터 기록, Intel CPU 계열
예) 32비트형 (4바이트) 값: 0x01020304
하위 주소 | 0x04 | 0x03 | 0x02 | 0x01 | 상위 주소 |
빅-엔디안 (Big-Endian)
낮은(시작) 주소에 상위 바이트부터 기록, Sparc / RISC CPU 계열
예) 32비트형 (4바이트) 값: 0x01020304
하위 주소 | 0x01 | 0x02 | 0x03 | 0x04 | 상위 주소 |
※ 0x는 16진수를 나타내는데, 16진수는 각 자리당 0~F(16개)로 표현한다.
각 자리당 16개를 나타낼 수 있으므로 4비트가 필요하다. (2^4=16)
따라서 1byte는 8bit니까 바이트씩 끊어 저장하면 2개씩 저장된다.
■ 리틀-엔디안 (Little-Endian)을 사용하는 이유
빅엔디안은 우리 눈으로 보기 쉽지만, ALU(산술연산유닛)에서 메모리를 읽는 방식이
메모리 주소가 낮은 쪽 ㅡ> 높은 쪽으로 읽기 때문에 리틀엔디안을 사용하면 산술연산 수행이 더 쉽다.
■ 리틀-엔디안, 빅-엔디안을 맞춰주어야 하는 이유
네트워크 프로그래밍에서 데이터를 다른 시스템으로 전송할 때
서로 다른 데이터 저장 방식의 시스템 끼리 통신하게 되면 전혀 엉뚱한 값을 주고 받을 수 있기 때문이다.
소켓은 기본적으로 빅엔디안으로 통일되어 있다.
■ 예제
#include <stdio.h> unsigned char *p; ㅡ> 포인터변수 생성 p = (unsigned char*)&inum; ㅡ> 변수 inum 의 주소를 p 에 저장
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
} |
예제를 통해 역순으로 출력되는 것을 보아 리틀-엔디안이다.
■ 후기
틀린 것 있으면 수정좀 부탁드립니다.
■ 출처
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 |