프로그래밍/웹, 네트워크

리틀 엔디언과 빅 엔디언

Hwan2 2020. 10. 22. 10:18
반응형

1. 엔디언?

리틀 엔디언과 빅 엔디언에 대해 알아보기 전, 엔디언이 무엇을 말하는지 알아보겠습니다.

엔디언은 메모리의 순서를 뜻합니다.

무슨 메모리의 순서? 데이터가 들어가는 순서 입니다.

프로그램을 실행 시킬 때, 프로그램에 대한 정보가 메모리에 올라가게 됩니다.

메모리는 이 모든 정보들을 byte단위로 저장하고 있지요.

여기서 그냥 메모리에 올라가는 것이 아니라 CPU의 처리에 따라 바이트가 올라가는 순서가 다릅니다.

그리고 이 순서는 크게 빅 엔디언과 리틀 엔디언 방식이 있습니다.

2. 리틀 엔디언

5678을 메모리에 넣는다고 가정해보겠습니다. 


리틀 엔디언은 역순으로 메모리에 저장됩니다. 


리틀 엔디언을 사용하는 CPU는 대표적으로 Intel, AMD가 있습니다. 


리틀 엔디언 같은 경우 산술 연산시 빠르다는 장점이 있습니다.


역순으로 정렬된 메모리에 순차적으로 접근하면서 맨 뒤에 수부터 더해가므로 carry가 발생해도 이를 쉽게 처리할 수 있습니다.


즉, 저희가 흔히 산술 연산하는 방법. ex) 1234 + 5678 일 때 맨 뒷수인 8과 4를 더하고 그 후 3과 7을 더하고 이런식으로 가게 됩니다.


하지만 빅 엔디언으로 되어있을 경우 1과 5를 더하고 2와 6을 더하고 이 과정에서 carry가 발생되면 해당 수를 올려주기 위해 다시 돌아오게 됩니다.


3. 빅 엔디언

5678을 메모리에 넣는다고 가정해보겠습니다. 

빅 엔디언 같은 경우 메모리에 정순으로 정렬되게 됩니다.


따라서 인간이 왼쪽에서 오른쪽으로 글을 써 내려가는 것과 같습니다.


쓰이는 곳은 주로 네트워크 프로토콜, IBM 시스템, ARM에서 사용하고 있습니다.


빅 엔디언 같은경우 데이터가 정렬되어 있어 순서대로 읽기가 빠릅니다. 


또한 바이트 순서에 신경써야할 곳인 네트워크 통신을 할 때 필요하게 됩니다.


4. 어떤걸 써야할 까?

요즘 라이브러리들은 잘 되어 있어서 디폴트로 데이터를 빅 앤디언 방식으로 바꿔 보내주게 됩니다.


C 언어 같은 경우에는 htons()를 사용해 빅 엔디언으로 바꿔줘야 합니다.



본인 시스템에서 어떤 엔디언을 사용하는지 알고 싶다면 다음 코드를 C 코드로 실행해 주시면 됩니다.


#include <iostream>

int main() {
    int i;
    int test = 0x12345678;
    char* ptr = (char*)&test; // 1 바이트만을 가리키는 포인터를 생성함.

    for (i = 0; i < sizeof(int); i++)
        printf("%x"ptr[i]); // 1 바이트씩 순서대로 그 값을 출력함.

    return 0;
}


빅 엔디언 Output : 12345678

리틀 엔디언 Output : 78563412


 해당 출력결과는 16진수를 1바이트씩 나타낸 것입니다. 햇갈리지 마세요. 10진수 아니에요!!

반응형