엔디언
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
엔디언은 컴퓨터에서 데이터를 저장하는 방식의 하나로, 《걸리버 여행기》에서 유래된 용어이다. 바이트 순서를 빅 엔디언과 리틀 엔디언으로 구분하며, 빅 엔디언은 사람이 숫자를 읽는 방식과 유사하게 상위 바이트를 메모리 앞 주소에 저장하고, 리틀 엔디언은 하위 바이트를 앞 주소에 저장한다. 미들 엔디언은 빅 엔디언과 리틀 엔디언이 혼합된 형태이다. 일부 아키텍처는 빅 엔디언과 리틀 엔디언을 모두 지원하는 바이 엔디언을 사용하며, ARM, PowerPC 등이 대표적이다. 엔디언은 소프트웨어, 하드웨어, 파일 시스템, 네트워킹 등 다양한 분야에서 영향을 미치며, 데이터 교환 시 바이트 스와핑이 필요할 수 있다. 날짜 표기법 또한 엔디언 개념으로 분류할 수 있다.
조너선 스위프트의 《걸리버 여행기》에 나오는 소인국 릴리퍼트 이야기에서 달걀을 깰 때 뭉툭한 끝(big-end)을 먼저 깨는 사람들(빅 엔디언)과 뾰족한 끝(little-end)을 먼저 깨는 사람들(리틀 엔디언) 사이에 격론이 벌어진 데서 엔디언이라는 단어가 유래했다. 빅 엔디언과 리틀 엔디언 중 어느 것을 쓰느냐 하는 문제는 상황에 따라 임의적이고, 따라서 종종 논란의 대상이 되었다. 컴퓨터와 관련해서 엔디언이라는 말은 대니 코언(Danny Cohen영어)이 1980년에 쓴 ''On Holy Wars and a Plea for Peace''라는 글에서 유래했다.[51][52]
엔디언이라는 단어는 조너선 스위프트의 《걸리버 여행기》에서 달걀을 깰 때 뭉툭한 끝(big-end)을 먼저 깨는 사람들(빅 엔디언)과 뾰족한 끝(little-end)을 먼저 깨는 사람들(리틀 엔디언) 사이에 벌어진 논쟁에서 유래했다.[40] 컴퓨터에서 엔디언은 1980년 대니 코언(Danny Cohen영어)의 글에서 유래했다.
2. 유래
3. 바이트 순서
바이트 순서는 크게 빅 엔디언과 리틀 엔디언으로 나눌 수 있으며, 일부 시스템에서는 미들 엔디언(Middle-Endian)을 사용하기도 한다. 빅 엔디언은 사람이 숫자를 쓰는 방법과 같이 큰 단위의 바이트가 앞에 오는 방법이고, 리틀 엔디언은 반대로 작은 단위의 바이트가 앞에 오는 방법이다.
컴퓨터 메모리는 일련의 저장 셀로 구성되며, 바이트 주소 지정을 지원하는 컴퓨터에서 이러한 단위는 ''바이트''라고 한다. 각 바이트는 메모리 주소로 식별되고 액세스된다. IBM 1401의 Add 명령처럼 일부 예외를 제외하면, 대부분의 시스템에서 다중 바이트 값의 주소는 첫 번째 바이트(가장 낮은 주소를 가진 바이트)의 주소이다.
"필드"의 일부인 바이트의 "유효성"은 바이트가 컴퓨터 하드웨어에 의해 액세스되는 순서에서 중요한 역할을 한다. 위치적 기수법(대부분 2진법)은 컴퓨터가 정수 데이터를 표현하는 주된 방식이다.
컴퓨터 하드웨어에서 직접 지원하는 정수 데이터는 8비트(1바이트), 16비트(2바이트), 32비트(4바이트), 64비트(8바이트), 128비트(16바이트)와 같이 2의 작은 거듭제곱의 고정된 너비를 갖는다.
메모리 바이트가 왼쪽에서 오른쪽으로 순차적으로 인쇄될 때(예: 16진수 덤프에서), 정수의 리틀 엔디언 표현은 오른쪽에서 왼쪽으로 중요도가 증가하여 시각적으로 거꾸로 나타나 직관적이지 않을 수 있다. 예를 들어, 16진수 ASCII로 저장된 문자열 "JOHN"은 빅 엔디언에서는 "J O H N"으로, 리틀 엔디언에서는 "N H O J"로 보인다.
자리 숫자 체계에서 일부 연산은 기본적인 단계를 실행하는 자연적이거나 선호되는 순서가 있다. 이 순서는 소규모 바이트 주소 지정 가능 프로세서 및 마이크로컨트롤러에서 성능에 영향을 줄 수 있다. 그러나 고성능 프로세서는 일반적으로 여러 바이트 피연산자를 동시에 가져오므로 하드웨어 복잡성은 바이트 순서에 영향을 받지 않는다.
할당 문에 의한 일반적인 데이터 전송은 원칙적으로 프로세서의 엔디언과 독립적이다.
다양한 다른 정렬 방식(미들 엔디언 또는 혼합 엔디언)도 가능하다. 컴퓨터에서 다루는 수치는 1바이트 외에도 2바이트, 4바이트, 8바이트 등 여러 바이트(다중 바이트)가 있다. 기억 장치에 다중 바이트 수치를 배치하는 순서 규칙(바이트 순서)도 여러 종류가 존재한다.[40]
숫자에서 가장 작은 자릿수의 1바이트를 가장 큰 주소의 기억 장치에 배치하여 순서대로 나열하는 규칙을 빅 엔디언, 가장 작은 주소의 기억 장치에 배치하여 순서대로 나열하는 규칙을 리틀 엔디언이라고 한다.[40][41]
이론상 바이트 순서는 빅 엔디언과 리틀 엔디언 외에도 존재하며, 2바이트는 2종류, 4바이트는 24종류, 8바이트는 40320종류가 가능하다. 현재는 빅 엔디언 또는 리틀 엔디언으로 수렴하고 있지만, 과거 PDP-11처럼 혼합적인 형식을 채택한 경우도 있었다.
3. 1. 빅 엔디언 (Big-Endian)
사람이 숫자를 쓰는 방식과 같이 상위 바이트를 메모리의 앞 주소에 저장하는 방식을 빅 엔디언이라고 한다. 예를 들어 0x12345678은 메모리에 12 34 56 78 순서로 저장된다.[12] IBM 메인프레임, 모토로라 프로세서, SPARC 등이 빅 엔디언을 사용한다.
TCP/IP 네트워크 프로토콜은 빅 엔디언을 사용한다. 이는 역사적으로 라우팅이 전화를 거는 식으로 접두 부호로 이루어졌기 때문이다.[44][45]
자리 숫자 체계에서 일부 연산은 기본적인 단계를 실행하는 자연적이거나 선호되는 순서가 있는데, 빅 엔디언은 이러한 연산에 있어 장점을 가진다. IBM 1401, 1410, 1620, System/360, System/370, ESA/390, 그리고 z/Architecture가 빅 엔디언을 사용한다.
IBM의 메인프레임, 모토로라의 MC68000(및 후속), 썬 마이크로시스템즈의 SPARC 등이 빅 엔디언을 채택하고 있다.
3. 2. 리틀 엔디언 (Little-Endian)
Little-Endian영어은 하위 바이트를 메모리의 앞 주소에 저장하는 방식이다. 예를 들어, 0x12345678은 메모리에 78 56 34 12 순서로 저장된다.[12]
x86 아키텍처가 리틀 엔디언을 사용하기 때문에, 오늘날 x86 아키텍처를 사용하는 대부분의 데스크톱 컴퓨터는 리틀 엔디언을 쓰며 이를 ‘인텔 포맷’이라 한다.[22][23] VAX, 애플 실리콘 등도 리틀 엔디언을 사용한다.
다음은 0x1234 및 0x12345678 값에 대한 빅 엔디언과 리틀 엔디언의 메모리 표현을 비교한 표이다.종류 0x1234의 표현 0x12345678의 표현 빅 엔디언 12 3412 34 56 78리틀 엔디언 34 1278 56 34 12
자리 숫자 체계에서 덧셈, 뺄셈, 곱셈은 가장 낮은 유효 숫자 위치에서 시작하여 올림수를 다음 상위 유효 위치로 전파하는데, 리틀 엔디언은 이 첫 번째 바이트에 가장 낮은 유효 숫자가 포함되어 있으므로 이러한 연산의 구현이 좀 더 간단하다.
대부분의 시스템에서 다중 바이트 값의 주소는 첫 번째 바이트(가장 낮은 주소를 가진 바이트)의 주소이다. 이러한 유형의 리틀 엔디언 시스템은 데이터 값이 충분히 낮을 경우, 서로 다른 주소를 사용하지 않고도 메모리에서 동일한 값을 서로 다른 길이로 읽을 수 있는 속성을 가지고 있다.
3. 3. 미들 엔디언 (Middle-Endian)
PDP-11과 같은 일부 아키텍처는 2바이트 단위와 1바이트 단위로 서로 다른 순서를 사용하기도 하는데, 이를 미들 엔디언이라 부른다.[31] 32비트 정수가 2바이트 단위로는 빅 엔디언이고 그 안에서 1바이트 단위로는 리틀 엔디언인 경우가 종종 있는데, 이를 '''미들 엔디언'''(Middle-endian영어)이라 한다.[31]
다음은 빅 엔디언, 리틀 엔디언, 미들 엔디언의 0x12345678 표현을 비교한 표이다.
| 종류 | 0x12345678의 표현 |
|---|---|
| 빅 엔디언 | 12 34 56 78 |
| 리틀 엔디언 | 78 56 34 12 |
| 미들 엔디언 | 34 12 78 56또는 56 78 12 34 |
VAX와 ARM에서는 배정밀도 부동소수점 실수를 미들 엔디언으로 저장하며, PDP-11에서는 32비트 정수를 미들 엔디언으로 저장하는데 이를 '''PDP 엔디언'''이라 부르기도 한다.[31]
PDP-11은 원칙적으로 16비트 리틀 엔디언 시스템이다. PDP-11/45, PDP-11/70 및 일부 후속 프로세서의 선택적 부동 소수점 프로세서에서 부동 소수점 값과 정수 값을 변환하는 명령은 32비트 "더블 정밀도 정수 롱" 값을 저장했으며, 16비트 절반(half)은 예상되는 리틀 엔디언 순서와 반대로 스왑되었다. UNIX C 컴파일러는 32비트 롱 정수에 대해 동일한 형식을 사용했다. 이 정렬 방식은 ''PDP 엔디언''으로 알려져 있다.[31]
이 엔디언을 해석하는 한 가지 방법은 32비트 정수를 빅 엔디언 워드 순서로 된 두 개의 리틀 엔디언 16비트 단어로 저장하는 것이다.
| 바이트 오프셋 | 8비트 값 | 16비트 리틀 엔디언 값 |
|---|---|---|
| 0 | 0Bh | 0A0Bh |
| 1 | 0Ah | |
| 2 | 0Dh | 0C0Dh |
| 3 | 0Ch |
3. 4. 장단점
빅 엔디언은 사람이 숫자를 읽는 방식과 같아 디버깅에 유리하다. 예를 들어 0x59654148은 빅 엔디언으로59 65 41 48로 표현되어 메모리의 값을 보기 편하다.[12] 반면 리틀 엔디언은 메모리에 저장된 값의 하위 바이트들만 사용할 때 별도의 계산이 필요 없다는 장점이 있다. 32비트 숫자인 0x2A는 리틀 엔디언으로 2A 00 00 00으로 표현되는데, 앞의 두 바이트나 한 바이트만 떼어 내면 하위 16비트나 8비트를 바로 얻을 수 있다.[12]가산기 설계는 최하위 비트(LSB)부터 시작하여 자리 올림을 계산하는 리틀 엔디언에서 조금 더 단순하다. 빅 엔디언에서는 가산기가 마지막 바이트부터 시작하여 역방향으로 진행해야 한다. 그러나 현대 프로세서는 여러 바이트를 동시에 처리하므로 엔디언에 따른 성능 차이는 크지 않다.[12]
3. 5. 바이 엔디언 (Bi-Endian)
몇몇 아키텍처는 빅 엔디언과 리틀 엔디언 중 하나를 선택할 수 있도록 설계되어 있으며, 이를 '''바이 엔디언'''(Bi-endian영어)이라고 부른다. ARM, PowerPC, DEC 알파, MIPS, PA-RISC, IA-64 등은 바이 엔디언을 사용하는 대표적인 아키텍처이다.[12] 이들 대부분은 컴퓨터가 시작된 상태에서 소프트웨어적으로 바이트 순서를 바꿀 수 있지만, 몇몇은 하드웨어에 내장된 펌웨어에서 바이트 순서를 선택해야 하는 경우도 있다.일부 명령 집합 아키텍처는 데이터 가져오기 및 저장, 명령 가져오기 또는 둘 다에서 전환 가능한 엔디언을 허용하는 설정을 특징으로 하며, 이러한 명령 집합 아키텍처를 ''바이-엔디언''이라고 한다. 전환 가능한 엔디언을 지원하는 아키텍처에는 PowerPC/Power ISA, SPARC V9, ARM 버전 3 이상, MIPS, 인텔 i860, PA-RISC, SuperH SH-4, IA-64, C-Sky, RISC-V가 있다. 이 기능은 네트워킹 장치 및 소프트웨어의 성능을 향상시키거나 논리를 단순화할 수 있다. 하드웨어에서 ''바이-엔디언''은 머신이 두 엔디언 형식 중 하나로 데이터를 계산하거나 전달할 수 있는 기능을 나타낸다.
이러한 아키텍처의 대부분은 소프트웨어를 통해 특정 엔디언 형식(일반적으로 컴퓨터가 시작될 때 수행됨)을 기본값으로 전환할 수 있다. 그러나 일부 시스템에서는 마더보드의 하드웨어에서 기본 엔디언을 선택하며 소프트웨어를 통해 변경할 수 없다(예: Cray T3E에서 빅 엔디언 모드로만 실행되는 Alpha).
IBM AIX 및 IBM i는 바이-엔디언 Power ISA에서 빅 엔디언 모드로 실행된다. 리눅스는 원래 빅 엔디언 모드로 실행되었지만, 2019년까지 IBM은 x86에서 Power로 리눅스 소프트웨어를 포팅하기 쉽게 하기 위해 리눅스에 대해 리틀 엔디언 모드로 전환했다.[25][26] SPARC는 Oracle Solaris와 리눅스 모두 바이-엔디언 SPARC 시스템에서 빅 엔디언 모드로 실행되므로 실제로는 빅 엔디언으로 간주할 수 있으며, 관련 리틀 엔디언 배포는 없다. ARM, C-Sky 및 RISC-V는 관련 빅 엔디언 배포가 없으며 실제로는 리틀 엔디언으로 간주할 수 있다.
''바이-엔디언''이라는 용어는 주로 프로세서가 데이터 액세스를 처리하는 방식을 나타낸다. 주어진 프로세서의 명령 액세스(명령어 단어 가져오기)는 데이터 액세스가 완전히 바이-엔디언인 경우에도 고정된 엔디언을 가정할 수 있지만, 인텔의 IA-64 기반 Itanium CPU와 같이 항상 그런 것은 아니다.
일부 명목상 바이-엔디언 CPU는 엔디언을 완전히 전환하기 위해 마더보드의 도움이 필요하다. 예를 들어, 리틀 엔디언 모드의 32비트 데스크탑 지향 PowerPC 프로세서는 실행 중인 프로그램의 관점에서 리틀 엔디언으로 작동하지만, 모든 8바이트 레인에서 64비트 교환을 수행하여 리틀 엔디언 보기가 I/O 장치에 적용되도록 마더보드가 필요하다. 이례적인 마더보드 하드웨어가 없는 경우, 장치 드라이버 소프트웨어는 불완전한 변환을 실행 취소하기 위해 다른 주소로 써야 하며 정상적인 바이트 교환도 수행해야 한다.
일부 CPU(임베디드 용으로 설계된 많은 PowerPC 프로세서 및 거의 모든 SPARC 프로세서)는 페이지별 엔디언 선택을 허용한다.
1990년대 후반 이후의 SPARC 프로세서(SPARC v9 호환 프로세서)는 메모리에서 로드하거나 저장하는 각 개별 명령으로 데이터 엔디언을 선택할 수 있다.
ARM 아키텍처는 ''BE-8'' 및 ''BE-32''라는 두 가지 빅 엔디언 모드를 지원한다.[27] ARMv5까지의 CPU는 BE-32 또는 단어 불변 모드만 지원한다. 여기서 모든 자연 정렬된 32비트 액세스는 리틀 엔디언 모드에서 작동하지만, 바이트 또는 16비트 단어에 대한 액세스는 해당 주소로 리디렉션되고 정렬되지 않은 액세스는 허용되지 않는다. ARMv6은 BE-8 또는 바이트 불변 모드를 도입하며, 여기서 단일 바이트에 대한 액세스는 리틀 엔디언 모드에서 작동하지만, 16비트, 32비트 또는(ARMv8부터) 64비트 단어에 액세스하면 데이터의 바이트 교환이 발생한다. 이렇게 하면 정렬되지 않은 메모리 액세스뿐만 아니라 32비트가 아닌 레지스터에 대한 메모리 매핑 액세스가 간소화된다.
많은 프로세서에는 레지스터의 단어를 반대 엔디언으로 변환하는 명령, 즉, 16-, 32- 또는 64비트 단어의 바이트 순서를 교환하는 명령이 있다.
최신 인텔 x86 및 x86-64 아키텍처 CPU에는 메모리에서 빅 엔디언 형식의 단어를 가져오거나 빅 엔디언 형식으로 메모리에 단어를 쓰는 MOVBE 명령(인텔 코어 4세대 이후, 아톰 이후)[28]이 있다. 이러한 프로세서는 그렇지 않으면 철저하게 리틀 엔디언이다.
SPARC는 역사적으로 빅 엔디언을 사용하다가 버전 9에서 바이-엔디언이 되었다. 마찬가지로 초기의 IBM POWER 프로세서는 빅 엔디언이었지만, PowerPC 및 Power ISA 후손은 현재 바이-엔디언이다. ARM 아키텍처는 바이-엔디언이 되기 전 버전 3에서 리틀 엔디언이었다.
4. 비트 순서
보통 바이트나 옥텟은 가장 작은 단위로 간주되지만, 종종 비트 단위 접근이 필요할 수 있다. 바이트 순서가 아니라 비트 순서를 따질 수도 있으나, 여러 가지 이유로 비트 순서는 상대적으로 덜 중요하다. 보통 메모리 접근은 바이트 단위로 이루어지기 때문에 비트 단위 접근에는 별도의 연산 과정이 필요하다. 하지만 이러한 연산 자체가 비트 순서에 대해 잘 정의되어 있기 때문에 비트를 접근하는 방법은 아키텍처에 중립적이다.
비트 순서와 비슷하게, 네트워크 프로토콜이나 파일 포맷 같이 저수준으로 내려갈 경우 비트 단위 데이터를 최상위 비트부터 채울 것인가 최하위 비트부터 채울 것인가 하는 문제가 있다. 예를 들어 C는 구조체에서 바이트보다 더 작은 단위의 변수를 선언할 수 있는 비트 필드를 지원하는데, 여러 개의 비트 필드가 배열되는 방법은 기계어를 생성하는 과정에서 중요해진다. 이때 최상위 비트(MSB)부터 채우는 것을 최상위 비트 우선, 최하위 비트(LSB)부터 채우는 것을 최하위 비트 우선이라 한다. 예를 들어 PNG와 GIF는 각각 최상위/최하위 비트 우선을 쓰는 대표적인 파일 포맷이다.
비트 순서는 1바이트 미만의 비트 단위 정렬 순서로, 레지스터 내 순서나 신호선 연결 순서로 전자 회로적으로 존재하지만, 프로그래머에게는 불필요한 정보이며, 명령 집합 아키텍처 등에서는 숨겨져 있다. 직렬 통신을 소프트웨어적으로 구현하는 경우 등에는 비트 정렬 순서를 고려할 필요가 있지만, 이는 CPU의 구현에 의존하지 않는 통신 프로토콜상의 규정이다.
5. 소프트웨어 및 하드웨어
컴퓨터는 1바이트 외에도 2바이트, 4바이트, 8바이트 등 여러 바이트(다중 바이트)로 된 수치를 다룬다. 기억 장치는 범용화를 위해 최소 1바이트 단위로도 다룰 수 있도록 1바이트마다 연속적인 번지(주소)가 할당되어 있다. 기억 장치에 다중 바이트 수치를 배치하는 순서 규칙(바이트 오더, 바이트 순서)에는 여러 종류가 존재한다.
서로 다른 엔디언을 가진 컴퓨터에서 생성된 파일이나 파일 시스템을 읽거나, 네트워크를 통해 데이터를 주고받을 때 엔디언의 차이는 중요한 문제가 된다.[34] 이를 해결하기 위해 다양한 방법들이 사용된다.
- 소프트웨어적 처리:
- 바이트 스와핑: 서로 다른 엔디언 시스템 간에 데이터를 교환하기 위해 바이트 순서를 변경하는 작업이다. 많은 컴파일러가 바이트 스와핑을 위한 내장 함수를 제공하며, 표준 네트워크 엔디언 함수, BSD 및 Glibc `endian.h` 함수, macOS `OSByteOrder.h` 매크로, C++23의 `std::byteswap` 함수 등을 사용할 수 있다.[13][14][15]
- 파일 형식:
- 포트란 순차 비형식 파일은 엔디언에 따라 호환성 문제가 발생할 수 있다.[34]
- 유니코드 텍스트는 바이트 순서 표시(BOM)를 사용하여 엔디언을 나타낼 수 있다.[34]
- MATLAB ''.mat'' 파일, ''.bil'' 데이터 형식과 같은 일부 애플리케이션 바이너리 데이터 형식은 엔디언에 독립적이다.[34]
- TIFF 이미지 파일은 헤더에 엔디언을 명시하여 호환성을 확보한다.[34]
- 파일 할당 테이블(FAT) 파일 시스템은 리틀 엔디언을 사용한다.[34]
- ZFS는 적응형 엔디언을 제공한다.[35]
- 하드웨어적 처리:
- 일부 CPU 명령어 집합은 엔디언 바이트 스와핑을 위한 네이티브 지원을 제공한다. 예를 들어 x86의 `bswap`, ARMv6 이상의 `rev` 명령어가 있다.[17][18]
- 역사적으로 다양한 프로세서들이 빅 엔디언 또는 리틀 엔디언 방식을 사용해 왔다.
- 인텔은 8008 프로세서부터 리틀 엔디언을 채택하여 현재의 x86 및 x86-64 아키텍처까지 이어지고 있다.[22][23]
- IBM System/360 계열은 빅 엔디언을 사용한다.
- PDP-11 계열은 리틀 엔디언을 사용한다.
- 모토로라 68000 시리즈는 빅 엔디언을 사용한다.
- MOS Technology 6502 제품군, Zilog Z80 등은 리틀 엔디언을 사용한다.
- 일부 프로세서는 엔디언을 전환할 수 있는 바이 엔디언(Bi-endian) 기능을 제공한다. ARM, PowerPC, MIPS 등이 대표적이다.[27]
- 네트워킹:
- TCP/IP 프로토콜은 빅 엔디언(네트워크 바이트 순서)을 표준으로 사용한다.[36] 버클리 소켓 API는 호스트 바이트 순서와 네트워크 바이트 순서 간 변환 함수를 제공한다.[38][39]
- 서버 메시지 블록(SMB), CANopen, 이더넷 파워링크 등 일부 프로토콜은 리틀 엔디언을 사용한다.[37]
TCP/IP 통신 규약에서는 빅 엔디언이 채택되어 있으며, 통신에 사용되는 숫자는 최상위 자릿수를 포함한 1바이트부터 먼저 송수신된다. 이를 '''네트워크 바이트 오더'''라고도 한다.[44][45]
5. 1. 바이트 스와핑 (Byte Swapping)
바이트 스와핑은 서로 다른 엔디언 시스템 간에 데이터를 교환하기 위해 바이트 순서를 변경하는 작업이다. 이는 엔디언을 변경하기 위해 바이트를 재배열하는 것으로 이루어진다.[13]많은 컴파일러는 바이트 스와핑을 위한 내장 함수를 제공한다. 예를 들어, `__builtin_bswap32`와 같은 내장 함수는 네이티브 프로세서 명령어 (`bswap`/`movbe`)로 컴파일될 가능성이 있다.
바이트 스와핑을 위한 소프트웨어 인터페이스는 다음과 같다:
- 표준 네트워크 엔디언 함수 (빅 엔디언에서/로, 최대 32비트).[13] 윈도우는 `winsock2.h`에 64비트 확장을 가지고 있다.
- BSD 및 Glibc `endian.h` 함수 (빅 엔디언 및 리틀 엔디언에서/로, 최대 64비트).[14]
- macOS `OSByteOrder.h` 매크로 (빅 엔디언 및 리틀 엔디언에서/로, 최대 64비트).
- C++23의 `std::byteswap` 함수.[15]
일부 CPU 명령어 집합은 엔디언 바이트 스와핑을 위한 네이티브 지원을 제공한다. 예를 들면 `bswap` (x86 — 486 이상, i960 — i960Jx 이상[17]) 및 `rev` (ARMv6 이상)[18]가 있다.
일부 컴파일러는 바이트 스와핑을 위한 내장 기능을 가지고 있다. 예를 들어, 인텔 포트란 컴파일러는 파일을 열 때 비표준 `CONVERT` 지정자를 지원하며, 이와 같이 사용할 수 있다. 다른 컴파일러는 모든 파일 I/O 작업에 대한 변환을 전역적으로 활성화하는 옵션을 가지고 있어, 코드 수정 없이 반대 엔디언을 가진 시스템에서 코드를 재사용할 수 있게 한다.
5. 2. 하드웨어
역사적으로 다양한 프로세서들이 빅 엔디언 또는 리틀 엔디언 방식을 사용해 왔다. 인텔은 8008 프로세서부터 리틀 엔디언을 채택하여 현재의 x86 및 x86-64 아키텍처까지 이어지고 있다.[22][23] Datapoint 2200이 자리 올림 전파를 용이하게 하기 위해 리틀 엔디언과 간단한 비트 직렬 논리를 사용했고, 인텔이 Datapoint를 위해 8008 마이크로프로세서를 개발했을 때 호환성을 위해 리틀 엔디언을 사용했기 때문이다. 인텔 8051은 다른 인텔 프로세서와 달리 LJMP 및 LCALL의 16비트 주소를 빅 엔디언 형식으로 예상하지만, xCALL 명령은 반환 주소를 스택에 리틀 엔디언 형식으로 저장한다.[24]IBM System/360은 빅 엔디언 바이트 순서를 사용하며, 후속 기종인 System/370, ESA/390, z/Architecture도 마찬가지이다. PDP-10은 바이트 지향 명령에 빅 엔디언 주소 지정을 사용하며, IBM Series/1 미니컴퓨터, 모토로라의 6800 / 6801, 6809, 68000 시리즈 프로세서도 빅 엔디언 형식을 사용한다. 전적으로 빅 엔디언 아키텍처에는 IBM z/Architecture 및 OpenRISC가 포함된다.
PDP-11 미니컴퓨터는 리틀 엔디언 바이트 순서를 사용하며, 후속 기종인 VAX도 마찬가지이다. MOS Technology 6502 제품군 (Western Design Center 65802 및 65C816 포함), Zilog Z80 (Z180 및 eZ80 포함), Altera Nios II, Atmel AVR, Andes Technology NDS32, Qualcomm Hexagon 및 기타 많은 프로세서 및 프로세서 제품군도 리틀 엔디언이다.
일부 프로세서는 엔디언을 전환할 수 있는 바이 엔디언(Bi-endian) 기능을 제공한다. ARM, PowerPC, DEC 알파, MIPS, PA-RISC, IA-64 등이 대표적이다.[27] 이들 대부분은 컴퓨터가 시작된 상태에서 소프트웨어적으로 바이트 순서를 바꿀 수 있지만, 몇몇은 하드웨어에 내장된 펌웨어에서 바이트 순서를 선택해야 하는 경우도 있다.
IBM AIX 및 IBM i는 바이-엔디언 Power ISA에서 빅 엔디언 모드로 실행된다. 리눅스는 원래 빅 엔디언 모드로 실행되었지만, 2019년까지 IBM은 x86에서 Power로 리눅스 소프트웨어를 포팅하기 쉽게 하기 위해 리눅스에 대해 리틀 엔디언 모드로 전환했다.[25][26] SPARC는 Oracle Solaris와 리눅스 모두 바이-엔디언 SPARC 시스템에서 빅 엔디언 모드로 실행되므로 실제로는 빅 엔디언으로 간주할 수 있으며, 관련 리틀 엔디언 배포는 없다. ARM, C-Sky 및 RISC-V는 관련 빅 엔디언 배포가 없으며, 실제로는 리틀 엔디언으로 간주할 수 있다.
1990년대 후반 이후의 SPARC 프로세서(SPARC v9 호환 프로세서)는 메모리에서 로드하거나 저장하는 각 개별 명령으로 데이터 엔디언을 선택할 수 있다. ARM 아키텍처는 ''BE-8'' 및 ''BE-32''라는 두 가지 빅 엔디언 모드를 지원한다. ARMv5까지의 CPU는 BE-32 또는 단어 불변 모드만 지원한다. ARMv6은 BE-8 또는 바이트 불변 모드를 도입했다.
최신 인텔 x86 및 x86-64 아키텍처 CPU에는 메모리에서 빅 엔디언 형식의 단어를 가져오거나 빅 엔디언 형식으로 메모리에 단어를 쓰는 MOVBE 명령(인텔 코어 4세대 이후, 아톰 이후)[28]이 있다.
5. 3. 파일 및 파일 시스템
서로 다른 엔디언을 가진 컴퓨터에서 생성된 파일이나 파일 시스템을 읽을 때 엔디언의 인식이 중요하다.[34]포트란 순차 비형식 파일은 하나의 엔디언으로 생성되면 다른 엔디언을 사용하는 시스템에서는 일반적으로 읽을 수 없다. 포트란은 일반적으로 레코드를 데이터 앞뒤에 데이터의 바이트 수와 같은 정수인 카운트 필드로 구현하기 때문이다. 다른 엔디언 시스템에서 이러한 파일을 읽으려고 하면 런타임 오류가 발생한다.[34]
유니코드 텍스트는 파일이나 스트림의 엔디언을 알리기 위해 선택적으로 바이트 순서 표시(BOM)로 시작할 수 있다. 코드 포인트는 U+FEFF이다. 예를 들어 UTF-32에서 빅 엔디언 파일은 00 00 FE FF로 시작하고, 리틀 엔디언은 FF FE 00 00으로 시작한다.[34]
MATLAB ''.mat'' 파일, 지형학에 사용되는 ''.bil'' 데이터 형식과 같은 애플리케이션 바이너리 데이터 형식은 일반적으로 엔디언에 독립적이다. 데이터를 항상 하나의 고정된 엔디언으로 저장하거나, 데이터와 함께 엔디언을 나타내는 스위치를 포함함으로써 이를 달성한다. 전자의 예시는 항상 리틀 엔디언인 바이너리 XLS 파일 형식으로, Windows와 Mac 시스템 간에 이식 가능하다.[34]
TIFF 이미지 파일은 헤더에 내부 바이너리 정수의 엔디언을 명시하는 방식으로, MM으로 시작하면 빅 엔디언, II로 시작하면 리틀 엔디언을 의미한다. 이러한 시그니처는 회문이므로 엔디언에 독립적이다. I는 인텔을, M은 모토로라를 의미하며, 인텔 CPU는 리틀 엔디언, 모토로라 680x0 CPU는 빅 엔디언이다. 이 명시적 시그니처를 통해 TIFF 리더 프로그램은 필요에 따라 바이트를 교환할 수 있다.[34]
인텔 8080 플랫폼에서 원래 구현된 파일 할당 테이블(FAT) 파일 시스템은 리틀 엔디언 바이트 순서로 정의되어 있다.[34]
ZFS는 파일 시스템과 논리 볼륨 관리자를 결합하여 적응형 엔디언을 제공하며, 빅 엔디언 및 리틀 엔디언 시스템 모두에서 작동한다.[35]
이미지나 음성 등의 데이터 형식은 규약으로 엔디언을 정하거나, 파일 헤더 등의 메타데이터로 지정하는 방식이 존재한다.[47][48]
유니코드의 다바이트 구성 요소 인코딩(주로 UTF-16)에서는 엔디언이 문제가 된다. 바이트 순서 마크(BOM)[49](U+FEFF)를 데이터 처음에 부여하여 엔디언을 판별할 수 있다. BOM이 없는 경우에는 빅 엔디언으로 간주된다.
5. 4. 네트워킹
TCP/IP 프로토콜은 빅 엔디언(네트워크 바이트 순서)을 표준으로 사용한다.[36] 버클리 소켓 API는 호스트 바이트 순서와 네트워크 바이트 순서 간 변환 함수를 제공한다.[38][39] 예를 들어, `htons` (호스트-네트워크-숏) 및 `htonl` (호스트-네트워크-롱) 함수는 16비트 및 32비트 값을 머신 (''호스트'')에서 네트워크 순서로 변환하고, `ntohs` 및 `ntohl` 함수는 네트워크 순서에서 호스트 순서로 변환한다. 이러한 함수는 빅 엔디언 시스템에서는 무연산일 수 있다.하지만 모든 프로토콜이 빅 엔디언을 사용하는 것은 아니다. 서버 메시지 블록(SMB) 프로토콜은 리틀 엔디언을 사용한다.[37] CANopen과 이더넷 파워링크도 리틀 엔디언을 사용한다.[37]
현재는 빅 엔디언 및 리틀 엔디언 컴퓨터가 모두 존재하며, 네트워크 통신을 위해 OS나 소프트웨어 등에서 서로 다른 엔디언 형식을 지원한다. TCP/IP 통신 규약에서는 빅 엔디언이 채택되어 있으며, 통신에 사용되는 숫자는 최상위 자릿수를 포함한 1바이트부터 먼저 송수신된다. 이를 '''네트워크 바이트 오더'''라고도 한다.[44][45]
6. 날짜 표현의 엔디언
날짜 표기법도 엔디언 개념으로 분류할 수 있다.[50] 2021년 4월 12일을 예로 들면 다음과 같다.
| 엔디언 종류 | 날짜 표기 | 사용 국가 |
|---|---|---|
| 빅 엔디언 (Big-Endian) | 2021/04/12 | 중국, 일본, 대한민국 등 |
| 리틀 엔디언 (Little-Endian) | 12/04/2021 | 영국, 프랑스, 독일, 이탈리아, 러시아 등 |
| 미들 엔디언 (Middle-Endian) | 04/12/2021 | 미국 |
날짜의 국제 규격인 ISO 8601에서는 빅 엔디언만 인정된다. 단, 구분 기호는 "/"가 아닌 "-"이어야 한다(예: 2021-04-12).
참조
[1]
IETF
On Holy Wars and a Plea for Peace
IETF
1980-04-01
[2]
서적
Gulliver's Travels
2022-09-20
[3]
Citation
Computer Systems: A Programmer's Perspective
Pearson Education
[4]
웹사이트
Understanding big and little endian byte order
https://betterexplai[...]
2019-05-20
[5]
웹사이트
Byte Ordering PPC
https://developer.ap[...]
2019-05-20
[6]
웹사이트
Writing endian-independent code in C
https://developer.ib[...]
2019-05-20
[7]
웹사이트
Internet Hall of Fame Pioneer
http://internethallo[...]
The Internet Society
2015-10-07
[8]
웹사이트
Endian FAQ
http://david.carybro[...]
2010-10-11
[9]
간행물
Multiplexed buses: the endian wars continue
1990-06
[10]
웹사이트
Endianness or Where is Byte 0?
http://3bc.bertrand-[...]
2008-12-21
[11]
IETF
A File Format for the Exchange of Images in the Internet
2021-08-16
[12]
서적
Structured Computer Organization
https://books.google[...]
Prentice Hall PTR
2012-08-04
[13]
문서
byteorder
Linux
[14]
문서
endian
Linux
[15]
웹사이트
std::byteswap
https://en.cpprefere[...]
2023-10-03
[16]
웹사이트
Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z
http://www.intel.com[...]
Intel
2017-02-05
[17]
웹사이트
i960® VH Processor Developer's Manual
https://datasheets.c[...]
Intel
2024-04-02
[18]
웹사이트
ARMv8-A Reference Manual
http://infocenter.ar[...]
ARM Holdings
2017-02-05
[19]
웹사이트
C11 standard
https://www.iso.org/[...]
ISO
2018-08-15
[20]
웹사이트
3.10 Options That Control Optimization: -fstrict-aliasing
https://gcc.gnu.org/[...]
Free Software Foundation
2018-08-15
[21]
mailing list
"[GIT PULL] Device properties framework update for v4.18-rc1"
https://lkml.org/lkm[...]
2018-06-05
[22]
웹사이트
Oral History Panel on the Development and Promotion of the Intel 8008 Microprocessor
http://archive.compu[...]
Computer History Museum
2006-09-21
[23]
서적
CJKV Information Processing
https://books.google[...]
O'Reilly Media, Inc.
2009-01-13
[24]
웹사이트
Cx51 User's Guide: E. Byte Ordering
http://www.keil.com/[...]
2015-03-28
[25]
웹사이트
Little endian and Linux on IBM Power Systems
https://developer.ib[...]
2022-03-27
[26]
웹사이트
The Transition To RHEL 8 Begins On Power Systems
https://www.itjungle[...]
2022-03-26
[27]
웹사이트
Differences between BE-32 and BE-8 buses
http://infocenter.ar[...]
2019-02-10
[28]
웹사이트
How to detect New Instruction support in the 4th generation Intel® Core™ processor family
https://software.int[...]
2017-05-02
[29]
Citation
Floating-Point Formats
http://www.quadibloc[...]
2018-07-16
[30]
웹사이트
pack – convert a list into a binary representation
http://www.perl.com/[...]
2009-02-04
[31]
서적
PDP-11/45 Processor Handbook
http://bitsavers.org[...]
Digital Equipment Corporation
[32]
간행물
Transporting a portable operating system: UNIX to an IBM minicomputer
1983-12-01
[33]
tech report
AMD64 Architecture Programmer's Manual Volume 2: System Programming
http://amd-dev.wpeng[...]
[34]
웹사이트
Microsoft Office Excel 97 - 2007 Binary File Format Specification (*.xls 97-2007 format)
http://download.micr[...]
Microsoft Corporation
2014-08-18
[35]
AV media
FreeBSD Kernel Internals: An Intensive Code Walkthrough
http://open-zfs.org/[...]
OpenZFS Documentation/Read Write Lecture
2016-03-30
[36]
IETF
Assigned Numbers
IETF
2012-03-02
[37]
간행물
EPSG Working Draft Proposal 301: Ethernet POWERLINK Communication Profile Specification Version 1.1.4
Ethernet POWERLINK Standardisation Group
2012
[38]
서적
The Open Group Base Specifications Issue 7
https://pubs.opengro[...]
2021-04-09
[39]
웹사이트
htonl(3) - Linux man page
https://linux.die.ne[...]
2021-04-09
[40]
서적
プログラミング作法
アスキー出版
[41]
서적
マイクロプロセッサ・アーキテクチャ入門 インターフェース増刊 TECHI Vol.20
CQ出版
[42]
서적
情報理論
オーム社
[43]
웹사이트
Endianness
https://developer.ar[...]
Arm Limited
2024-07-17
[44]
웹사이트
https://atmarkit.itm[...]
[45]
웹사이트
https://ascii.jp/ele[...]
[46]
웹사이트
https://www.seagate.[...]
[47]
웹사이트
https://xiph.org/fla[...]
[48]
웹사이트
http://www.libpng.or[...]
[49]
웹사이트
Unicode Terminology English - Japanese, B
https://www.unicode.[...]
Unicode, Inc.
[50]
웹사이트
Date Format Variations: Little-Endian, Middle-Endian, Big-Endian
https://www.proofrea[...]
proofreading academy
[51]
간행물
これ以前の用語が「byte order」であったことなどもわかる
http://www.ietf.org/[...]
Internet Experiment Note
1980-04-01
[52]
논문
On Holy Wars and a Plea for Peace
Computer
1981-10
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com