4. byte-order, Endian

emdev·2023년 5월 7일
0

C언어

목록 보기
4/4

본격적인 프로그래밍을 하기 전에 알아야 할 것들이 많긴 하다.
사전 지식 중, 이 Endian이라 부르는 byte-order는 알아야 할 항목 중 하나다.

이에 대하여 하나씩 설명을 해 나가도록 하겠다.


1) Endian의 의미

Endian이란 하나의 byte를 이어 붙일 때, 데이터의 쌓는 방향을 의미하며, 일반적으로 4 byte를 기준으로 이 Endian을 설명한다.

쉽게 이야기를 하면,
0x12345678이란 데이터가 있다고 가정을 하자.
그럼 이를 byte단위로 쪼개면 데이터는 어떤 방향으로 쌓게 되는가?
에 대한 물음을 답 하는 것이 byte-order, 즉 Endian이다.

Endian의 종류는 big-Endian, little-Endian, Middle-Endian으로 나뉘지만, 일반적으로 big-endian과 little-endian을 비교를 많이 한다. 여기선 필자가 middle-endian은 굉장히 생소하고 사용하는 케이스를 본 적이 없으므로 다루지는 않고, little-endian과 big-endian을 다루도록 하겠다.

2) Little Endian

16진수인 0x12345678이란 값이 little-endian의 경우 아래의 표와 같이 데이터가 정렬이 된다.

3210
12345678

숫자도 가장 오른쪽이 단위가 작은 수 인 것처럼, byte또한 가장 작은 단위부터 낮은 index에 위치하는 형태의 표현을 little-endian이라고 한다.

3) Big Endian

위 little-endian에서 예시했던 16진수 0x12345678을 big-endian으로 표현할 경우, 아래의 표와 같이 된다.

3210
78563412

다시 바꿔서 보면,

0124
12345678

즉 가장 큰 단위부터 낮은 index에 위치한다.

4) 그럼 이게 왜 중요한가?

일반적으론 크게 신경 쓸 일이 없다. 왜냐하면 대부분의 endian은 little-endian을 채용하여 시스템을 구성하기 때문이다. 하지만 그렇다고 big-endian을 사용하지 않는 것은 아니다. 가장 대표적으로 big-endian을 채용한 시스템은 network이기 때문이다.

네트워크계열의 상단을 개발을 하다 보면 endian을 신경쓰지 않을지도 모르지만, 물리계층 영역부터 개발을 하게 되면, IP계층부터 byte-align convert를 해야 하는 일이 종종 생긴다.

이 뿐만이 아니라, MCU에서도 대부분은 little-endian을 채용을 하고 있지만, 일본계 계열 MCU(구 freescale 현 NXP, Motorolla등) 자체 개발한 코어+MCU에선 big-endian을 채용하는 일이 많다.

다른 little-endian에서 사용했던 코드가 이런 big-endian MCU에서 재활용을 할 때, 문제가 발생하면 이 부분을 의심을 할 수 있으므로, 한번쯤은 짚고 넘어가야 했기에 이렇게 글을 남긴다.

profile
감성 충만한 월하광인이 만든 velog

0개의 댓글