Endian

Big & Little endian
단위가 1byte이다.
    Big endian
직관적인 방벙이다. 최상위 바이트를 먼저 저장하고 그 순서로 아래로 저장한다.
가장 높은 자리의 바이트들이 먼저 저장된다.
0x12345678 ->
12 34 56 78
    Little endian
big endian과 반대로 최하위 바이트를 먼저 저장하고 그 순서로 위로 저장한다.
x86 계열의 프로세서들은 리틀 엔디안 표현을 사용한다.
0x12345678 ->
78 56 34 12
endian.c
#include<stdio.h>
int main(void){
unsinged short word=0x1234;
unsigned char *p=(unsigned char *)&word;
if(p[0]==0x12)printf("Big Endian Machine\n");
else printf("Little Endian Machine\n");
}

Little Endian Machine

endian은 컴퓨터 시스템에서 물리 데이터(디스크)나 네트워크를 통해서 이진 데이터가 송신될 때,
이를 고려해 주어야 한다.
(아스키 데이터의 경우 단일 바이트 이므로 엔디안은 문제가 안된다.
하지만 UNICODE와 같은 멀티 바이트 문자 세트의 출현에 따라 텍스트 데이터 에서도 이를 고려해야 한다.)

모든 TCP/IP 헤더들은 데이터를 Big endian 형식으로 저장한다.(network byte order)
TCP/IP 라이브러리는 C로 하여금 엔디안 관련 함수들을 지원한다.
htonl() :host endian->network endian
ntohl() :network endian->host endian
(사실 위 두 함수는 같은 역할을 수행한다.)

이는 W.Richard Steven의 'UNIX Network Programming' 에서 상세하게 기술되어 있다.
endian_invert function
unsinged invert_endian(unsigned x){
unsigned invert;
const unsigned char *xp=(const unsigned char *)&x;
unsigned char *ip=(unsigned char *)&invert;
ip[0]=xp[3];
ip[1]=xp[2];
ip[2]=xp[1];
ip[3]=xp[0];
return invert;
}
위와 같은 엔디안 형식 변환은
486프로세서는 32비트 레지스터의 바이트를 역순으로 재배치하는 명령인 BSWAP을 추가하였다.
bswap edx ;edx
이 명령어는 16비트 레지스터에서는 사용될 수 없다.
하지만 XCHG 명령어를 통해 두개의 8비트 레지스터로 쪼개어 질 수 있는
16비트 레지스터의 바이트를 역순으로 재배치 할 수 있다.
(2바이트임으로 AH, AL 레지스터의 순서를 교체 시켜주면 된다.)
xchg ah,al ;ax