리틀엔디언과 빅 엔디언
임베디드 소프트웨어 개발을 하다보면 많이 헷갈리는 것이 이진데이터 포멧이다.
그중 리틀엔디안(Little Endian)과 빅엔디안(Big Endian)에 대해 알아보자. 사실 관련 인터넷 글은 넘치고 넘치고, 막상 보면 그러려니 하고 넘어간다. 하지만 소프트웨어 개발하면서 실제 데이터를 다루다보면 헷갈리기 쉬운 것들이다. 알고 있다고 생각하지만, 항상 헷갈리는 그 넘들, 확실하게 개념을 잡아놓는게 좋다.
엔디안(Endianness)은 데이터 저장방식이다. 정확히는 바이트(byte) 데이터를 어떤 순서로 저장하는지 하는 것이다. 데이터 저장방식을 논하기 이전에 데이터 자체를 먼저 짚고 넘어가자.
비트는 0과 1의 이진수다.
8비트가 모이면 1바이트(byte)다.
비트와 바이트가 전세계의 모든 컴퓨터 시스템의 기본 데이터 단위다.
나머지 것들은 이 두 단위를 확장한 것에 불과하다.
다시 한번 기억하자. 비트와 바이트가 디지털 데이터의 기본 단위다.
워드(Word)는 임베디드기기의 CPU에서 사용하는 기본 데이터 단위다.
16비트 마이크로프로세서가 들어있는 임베디드 기기의 워드는 16비트(2바이트)다.
32비트 PC의 워드는 32비트, 64비트 스마트폰의 워드는 64비트(8바이트)이죠잉~
64비트이건 32비트이건 데이터를 메모리에 적재하는 기본 단위는 바이트다. 그래서 바이트 순서(엔디안)이 중요하다.
다음은 통상적으로 프로그래밍에서 많이 사용되는 데이터 단위다.
CHAR = 1 바이트
SHORT = 2 바이트
INT = 4 바이트
엔디안은 워드와 이 데이터 단위들에 따라 데이터의 각 바이트들을 메모리에 어떻게 적재햐느냐 하는 것이다.
말이 좀 어렵게 생각될 수도 있으나, 위 문장을 확실히 이해하고 있다면 현업에서 일하다가 엔디안때문에 헷갈릴 일은 없다.
우선 리틀엔디안(LE)이 가장 많이 사용되는 포멧이므로, 이것부터 알아보자. 리틀엔디안은 말 그대로 작은 바이트(byte, 8bit)을 먼저 메모리에 저장하는 방식이다. 32비트 리틀엔디안 컴퓨터에서 0x12345678이라는 1 워드(= INT) 데이터는 다음과 같이 메모리에 적재된다.
빅엔디안은 거꾸로니까 다음과 같이 저장된다.
SHORT 데이터인 0x1234는 리틀엔디안인 경우 메모리에 다음과 같이 적재된다.
여기까지 보고 다 쉽군~ 하고 그냥 넘어가면 막상 실제 일할때 헷갈리게 된다.
뭐가 헷갈리는가? 실제 코딩시 비트,바이트 연산할때 헷갈리게 된다.
대표적인 예가 데이터 형변환이다.
INT나 SHORT, CHAR 등 서로 다른 크기의 데이터를 다른 데이터포멧으로 사용하는 것을 데이터 형변환이라고 하며, 프로그래밍에서 흔하게 사용된다.
다음의 코드를 보자.
INT A = 0x12345678;
SHORT B;
B = (SHORT) A; /* INT에서 SHORT로 데이터 형변환 */
B에 들어가는 값은 0x5678 이다. 이것은 프로그래밍언어에서 제공하는 형변환(casting)으로 리틀엔디안이나 빅엔디안이나 똑같다. 리틀엔디안이나 빅엔디안 고민할 필요가 없다는 얘기다.
하지만 메모리 위치에 따른 연산이 발생하는 경우는 엔디안의 영향을 받는다. 배열이나 포인터를 사용하는 경우다. 밑줄좍 - 엔디안은 메모리 위치에 따른 연산이 발생하는 경우 주의를 기울여야 한다!!
다음 예제를 보자.
CHAR a[] = {0x12,0x34,0x56,0x78};
INT b = *(INT*)a;
SHORT c = *(SHORT*)a;
리틀엔디안이나 빅엔디안이나 바이트 데이터인 a는 메모리에 다음과 같이 저장된다.
위 예제에서 b는 a의 메모리 위치(0x0)의 데이터를 INT 형만큼 가지고 온것이다.
따라서 b의 값은 리틀엔디안의 경우는 0x78563412 가 되고, 빅엔디안은 0x12345678 가 된다.
마찬가지로 c의 값은 리틀엔디안의 경우는 0x3412 가 되고, 빅엔디안은 0x1234 가 된다.
실제 임베디드 소프트웨어 개발은 다른 소프트웨어군보다 메모리나 데이터연산 코드가 많다. 메모리를 직접적으로 억세스할 일이 많기 때문이다.
졸저 <개발자 오디세이아> 가 책으로 나왔습니다. 개발자들의 애환과 희망을 담으려 최선을 다했습니다. 많은 사랑 부탁드립니다^^