16진수 0x12345678을 저장하기 위해서는 4byte의 메모리 공간이 필요하다.
실제 메모리에는 이 값이 어떻게 저장될까?
컴퓨터 시스템 마다 차이가 있는데 크게 Little Endian과 Big Endian Mode가 있다. (+Middle Endian)
Little Endian은 인텔(x86)에서, Big Endian은 모토로라에서 사용했던 방식이다.
Little Endian은 높은 자리 수를 낮은 주소에, 낮은 자리 수를 높은 주소에 저장하고
Big Endian은 낮은 자리 수는 낮은 주소에, 높은 자리 수는 높은 주소에 저장한다.
0x12345678을 0x00001000번지에 저장하는 경우는 다음과 같다.
*(unsigned int*)(0x00001000) = 0x12345678;
address | Little Endian | Big Endian |
0x00000fff | ... | ... |
0x00001000 | 0x78 | 0x12 |
0x00001001 | 0x56 | 0x34 |
0x00001002 | 0x34 | 0x56 |
0x00001003 | 0x12 | 0x78 |
0x00001004 | ... | ... |
디버깅 시에 어떤 값이 저장돼있는지 확인할 경우, Endian Mode가 무엇인지 확인할 필요가 있다.
또한, 서로 다른 시스템 사이에서 데이터를 주고 받게 되면, 특히나 1byte 단위로 통신을 하게 되면 문제가 된다.
PC의 경우, x86 CPU를 많이 사용하므로 Little Endian을 염두에 두면 편하지만
모토로라의 영향 때문인지 많은 네트워크 프로토콜에서 Big Endian을 사용하고 있으므로 일괄적으로 사용해서는 안된다.
ARM 프로세서에서는 Endian Mode를 지정할 수 있다. (Bi-Endian)
'Study > Programming' 카테고리의 다른 글
[C/C++] Implicit Conversions (0) | 2020.10.07 |
---|---|
Memory Pool을 이용한 Linked List 구현 (0) | 2020.09.26 |
댓글