1. Endian
Endian은 걸리버 여행기의 소인국 이야기에서 달걀을 깰 때, 뭉툭한 끝(big-end)을 먼저 깨는 사람들(빅 엔디언)과 뾰족한 끝(little-end)을 먼저 깨는 사람들(리틀 엔디언) 에서 유래된 것으로, 컴퓨터 아키텍에서 메모리에 자료가 저장하고 표현할 바이트 단위로 저장되는 방식을 의미한다.
부호가 없는 unsigned int를 가지고 이야기를 해보고자 한다.
C언어에서 unsigned int 형의 범위는 0 ~ 4,294,967,295 이지만, 컴퓨터 아키텍쳐에서 메모리의 한 Byte의 크기는 256 이므로 unsigned int는 너무 커서 1byte에 모두 담을 수 없고, 4 byte에 나누어 담아야한다. 메모리에 4byte에 해당하는 값을 저장하게 된다.
- 낮은 byte를 높은 주소에 저장하는 가?
- 높은 byte를 높은 주소에 저장하는 가?
낮은 byte를 높은 주소에 저장한다면 Big Endian, 높은 byte를 높은 주소에 저장한다면 Little Endian이라고 한다.
이해가 잘 가지 않을 수 있으니 아래에서 좀 더 자세히 다루어보자!
2. Big Endian
Big Endian은 낮은 자리의 Byte가 높장 낮은 자리의 주소에 저장되는 방식이다.

IBM 또는 Motorola 의 많은 시스템들이 big Endian 방식을 사용하고 있음.
3. Little Endian
little Endian은 낮은 자리의 byte가 낮은 자리의 주소에 저장되는 방식이다.

intel 계열의 cpu와 AMD의 processor는 Little Endian 방식을 사용하고 있음.
4. Little Endian 실습

# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
unsigned int number;
unsigned char arr[4];
scanf("%u", (int*)arr);
for (int i = 0; i < 4; i++) {
printf("%hhu", &arr[i]);
}
return 0;
}
위의 예시 코드를 가지고 한 줄씩 디버깅을 하면서 살펴보자
insigned int 변수를 선언했고, unsigned char 배열을 선언했다.
그리고 scanf 함수를 이용해서 305419896을 unsigned char 배열에 int*형의 값을 넣어주었다.
무슨 일이 일어날까??
조사식을 보면 다음과 같다.

위의 조사식에서
앞에있는 값은 10진수, 뒤에 있는 값은 아스키 코드를 나타낸다.
따라서 10진수를 16진수로 바꾸어보면
120 -> 0x78
86 -> 0x56
52 -> 0x34
12 -> 0x12
이처럼 높은 바이트의 값이 높은 주소에 저장되어 있다는 것을 알 수있다.

현재 우리가 사용하고 있는 대부분의 cpu (intel 또는 amd) 는 Little Endian 방식을 사용하고, 다음과 같이 실습해 볼 수있을 것이다. 다만 Mac의 경우는 조금 다를 수 있다.
'Program Language > C' 카테고리의 다른 글
| [C] Call by Reference VS Call by Value (0) | 2023.11.06 |
|---|