#include <stdio.h>
#include "string.h"
void main()
{
unsigned char m_SendDataBufferTemp[10];
short int intTemp = 0x1CFF;
int i=0;
for(i=0; i<10; i++)
{
m_SendDataBufferTemp[i] = 0x01;
}
memcpy(&m_SendDataBufferTemp[1], &intTemp, sizeof(intTemp));
for(i=0; i<10; i++)
{
printf("\n m_SendDataBufferTemp[%d] = %x", i, m_SendDataBufferTemp[i]);
}
printf("\n shortint size = %d", sizeof(short int));
printf("\n unsigned char size = %d", sizeof(unsigned char));
}
동한씨가 나에게 물어서 위와 같이 코딩을 하게 되었다....
헌데, 데이터 표출을 해보니...SendDataBufferTemp[1] = FF, SendDataBufferTemp[2] = 1C 이렇게 저장이 되더군...
너무 어처구니가 없어서...이것저것 찾아봤더니...
<Endian - 메모리 저장 순서를 규정>
|
|
cpu마다 메모리에 데이터를 저장시킬 때 방식이 다르다.
Intel x86 같은 경우에는 Little-endian 방식을 채택, Sun, 모토로라계열은 Big-endian 방식을 채택하였다.
Little/Big-Endian의 차이는 논리적 메모리 공간에 그 메모리 폭(어떤 메모리건 논리적 메모리 공간의 폭은 모두 1 Byte)을 넘어서는 Data를 저장할 때 발생한다. 예를들어 0A0B라는 Word Size의 Hexadecimal 데이터를 11000H의 메모리에 저장한다고 해보자.
위에 그림에서 알 수 있듯이 1 Byte 단위로 끊었을 때,
하위 데이터인 0B가 하위 메모리 공간인 11000H에 저장된다. 하나의 메모리 공간(1 Byte)을 다 채웠으므로 다음 주소로 넘어가서,
상위 데이터인 0A가 상위 메모리 공간인 11001H에 저장된다.
이것이 Little-endian이다.
Big-endian은 반대로
상위 데이터인 0A가 하위 메모리 공간인 11000H에 저장된다. 하나의 메모리 공간(1 Byte)을 다 채웠으므로 다음 주소로 넘어가서,
하위 데이터인 0B가 상위 메모리 공간인 11001H에 저장된다.
한마디로 말하자면, 위와 같은 방식으로 논리적 메모리 공간에 저장되는 데이터의 순서 차이일 뿐이다.
- Little Endian : 가독성이 좋고, 대소 비교가 빠르다.
- Big Endian : 산술연산이 빠르다
사족으로 이 방식이나 CPU의 종류에 따라 stack에 push, pop하는 방식(Stack Pointer를 증가시키고 감소시키고하는 방식) 또한 다르다
논리적 메모리 공간 / 물리적 메모리 공간에 대해서 정리할 것.
이라고 한다.....
아~놔...난 왜 이런걸 지금에서야 알았을까....대학교 네트워크수업때 배우는거라는데 난 그수업 C 맞아서 그런건가...ㅡㅡ;
'Programer Story > Remember Story!!!!!' 카테고리의 다른 글
PostMessage & SendMessage (0) | 2011.12.14 |
---|---|
컴퓨터 작업 프로시져 관리 (0) | 2011.05.29 |
MS XML 파싱할때에는... (0) | 2011.05.29 |
reinterpret_cast 연산자 (0) | 2011.05.29 |
인터페이스와 추상 클래스 (0) | 2011.05.28 |