Big-endian? Little-endian?

About_work·2024년 2월 6일
0

cs 기초

목록 보기
16/38

1. 들어가기 전에

1.1. 16진수란?

  • 0x12345678
    • 0x는 16진수를 나타내는 접두사 (x: hexadecimal)
    • 0 만 있으면 8진수를 나타내느 접두사
    • 8자리의 16진수를 나타냄
  • 16진수의 1자리는 4비트로 표현됨
  • 16진수의 2자리는 1바이트로 표현됨
  • 위 8자리의 16진수는, 4바이트임

1.2. 메모리 주소는 16진수

  • 16진수 표현 방식 메모리 주소와 같은 저수준(low-level, 컴퓨터의 하드웨어와 직접적으로 상호작용하는 데이터)의 데이터를 다룰 때 매우 효율적

1.2.1. 16진수 사용의 이유:

  1. 간결성: 16진수는 2진수 데이터를 더 간결하게 표현할 수 있습니다. 2진수로 매우 길게 표현되는 주소를 16진수를 사용하여 짧고 알아보기 쉽게 만들 수 있습니다. 예를 들어, 2진수로 1111111111111111을 16진수로는 FFFF로 표현할 수 있습니다.

  2. 가독성: 16진수는 2진수에 비해 훨씬 가독성이 높습니다. 2진수로 표현된 주소는 매우 길고 이해하기 어렵지만, 16진수로 표현하면 짧고 명확하게 인식할 수 있습니다.

  3. 표준화: 메모리 주소를 16진수로 표현하는 것은 프로그래밍과 컴퓨터 과학에서 오랫동안 사용된 표준 관습입니다. 디버거, 메모리 분석 도구, 다양한 프로그래밍 언어와 시스템에서 이러한 방식이 일관되게 사용됩니다.


1.3. 메모리 주소에서 낮은 주소? 시작 주소?

  • 컴퓨터 메모리는 데이터를 저장하기 위한 일련의 연속된 공간으로 구성되어 있으며, 각 공간은 고유한 주소를 가집니다.
  • 이 주소를 사용하여 컴퓨터는 메모리 내의 특정 위치에 접근할 수 있습니다.

1.3.1. 메모리의 낮은 주소와 높은 주소

  • 메모리의 낮은 주소(Low Memory Address), 시작 주소:
    • 메모리 공간의 시작 부분에 가까운 주소를 의미
    • 일반적으로 메모리 주소는 0부터 시작하며, 이 "0" 주소 또는 그에 가까운 주소들을 낮은 주소
  • 메모리의 높은 주소(High Memory Address), 끝 주소:
    • 반대로 메모리 공간의 끝 부분에 가까운 주소를 의미합니다.
    • 컴퓨터의 총 메모리 크기에 따라 최대 주소값이 결정되며, 이 최대값에 가까운 주소들을 높은 주소

1.3.2. 메모리의 시작 주소

  • 메모리의 시작 주소(Memory Start Address): 메모리 공간이 시작하는 지점의 주소를 말합니다. 컴퓨터 시스템에서는 이 주소를 "0"으로 표현하는 경우가 일반적입니다. 메모리의 시작 주소는 메모리 공간을 참조하고 접근하는 기준점 역할을 합니다.

2. 본론

  • 빅 엔디안(Big-endian)과 리틀 엔디안(Little-endian)은 멀티바이트 데이터 포맷을 메모리에 저장하는 방식에 관한 용어
  • 이 개념은 특히 바이트 순서(byte order)를 다루는 컴퓨터 아키텍처에서 중요
  • 빅 엔디안(Big Endian): 멀티바이트(여러 바이트로 구성된) 값을 메모리에 저장할 때, 가장 큰 바이트(가장 중요한 바이트)를 낮은 메모리 주소에 먼저 배치하는 방식입니다. 예를 들어, 0x12345678과 같은 4바이트 값을 메모리에 저장할 때, 0x12가 가장 낮은 주소에, 그 다음 0x34, 0x56, 0x78 순으로 메모리에 저장됩니다.
  • 리틀 엔디안(Little Endian): 반대로, 가장 작은 바이트(가장 덜 중요한 바이트)를 낮은 메모리 주소에 먼저 배치하는 방식입니다. 위의 예에서 리틀 엔디안 방식을 사용한다면, 0x78이 가장 낮은 주소에, 그 다음 0x56, 0x34, 0x12 순으로 저장됩니다.

이러한 엔디안 방식은 데이터를 메모리에 어떻게 저장하고 해석할지를 결정하는 중요한 요소이며, 시스템 아키텍처마다 다를 수 있습니다.

2.1. 빅 엔디안(Big-endian)

  • 빅 엔디안 방식에서는 가장 큰 바이트(높은 자릿수 바이트)가 메모리의 가장 낮은 주소에 저장됩니다. 다시 말해, 멀티바이트 값의 시작 바이트가 메모리의 시작 주소에 위치합니다.

예를 들어, 0x12345678라는 32비트 값이 있을 때, 빅 엔디안 방식으로 메모리에 저장하면 다음과 같이 됩니다:

메모리 주소:    ... 0x01 0x02 0x03 0x04 ...
저장된 값:      ... 0x12 0x34 0x56 0x78 ...

2.2. 리틀 엔디안(Little-endian)

  • 리틀 엔디안 방식에서는 가장 작은 바이트(낮은 자릿수 바이트)가 메모리의 가장 낮은 주소에 저장됩니다. 즉, 멀티바이트 값의 마지막 바이트가 메모리의 시작 주소에 위치합니다.

위와 같은 0x12345678 값이 리틀 엔디안 방식으로 메모리에 저장되면 다음과 같이 됩니다:

메모리 주소:    ... 0x01 0x02 0x03 0x04 ...
저장된 값:      ... 0x78 0x56 0x34 0x12 ...

2.3. 빅 엔디안과 리틀 엔디안의 장단점 비교

2.3.1. 빅 엔디안(Big Endian)

  • 장점:

    • 숫자 읽기: 숫자를 사람이 읽는 방식과 유사합니다. 예를 들어, 0x123456을 메모리에 저장할 때 빅 엔디안은 12 34 56 순서로 저장합니다. 이는 사람이 숫자를 왼쪽에서 오른쪽으로 읽는 것과 같아서, 메모리 덤프를 볼 때 직관적입니다.
    • 네트워크 표준 호환성: 인터넷 프로토콜은 빅 엔디안을 사용합니다. 따라서 빅 엔디안 시스템은 네트워크 데이터를 처리할 때 변환 과정이 필요 없어 효율적일 수 있습니다.
  • 단점:

    • 리틀 엔디안 시스템과의 호환성: 리틀 엔디안을 사용하는 시스템과 데이터를 교환할 때는 바이트 순서를 바꿔야 하므로 추가 작업이 필요합니다.

2.3.2. 리틀 엔디안(Little Endian)

  • 장점:

    • 계산 효율성: CPU가 데이터를 처리할 때, 가장 낮은 바이트부터 처리하기 시작하는 경우가 많습니다. 리틀 엔디안은 가장 낮은 바이트를 가장 낮은 주소에 저장하기 때문에, 일부 연산에서 더 효율적일 수 있습니다.
    • 다양한 길이의 데이터 처리 용이성: 예를 들어, 32비트 시스템에서 16비트 데이터를 처리할 때 리틀 엔디안은 상위 바이트를 무시하기만 하면 되므로 간단합니다.
  • 단점:

    • 숫자 읽기의 불편함: 메모리에서 숫자를 읽을 때 사람이 숫자를 읽는 순서와 반대이므로, 메모리 덤프를 볼 때 직관적이지 않을 수 있습니다.
    • 네트워크 표준과의 호환성: 네트워크 프로토콜이 빅 엔디안을 사용하기 때문에, 리틀 엔디안 시스템은 네트워크 데이터를 처리할 때 바이트 순서를 바꿔야 합니다.

요약

  • 빅 엔디안은 사람이 숫자를 읽는 방식과 유사하여 직관적이지만, 리틀 엔디안 시스템과의 데이터 교환 시 변환 작업이 필요합니다.
  • 리틀 엔디안은 컴퓨터 처리에는 더 최적화되어 있을 수 있으나, 숫자를 사람이 읽기에는 덜 직관적이고 네트워크 표준과의 호환성을 위해 변환 작업이 필요할 수 있습니다.

각 방식은 특정 상황에서 장점을 가지므로, 사용하는 시스템의 아키텍처와 요구 사항에 따라 적합한 방식을 선택해야 합니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글