엔디안니스
Endianness![]() |
컴퓨팅에서 엔디안니스(endianness)는 컴퓨터 메모리에 있는 디지털 데이터 워드의 바이트 순서 또는 시퀀스입니다.엔디안은 주로 빅엔디안(BE) 또는 리틀엔디안(LE)으로 표현됩니다.빅 엔디언 시스템은 워드의 최상위 바이트를 최소 메모리 주소로, 최하위 바이트를 최대 메모리 주소로 기억한다.반면 리틀 엔디언 시스템은 최소 주소에 [1][2][3]최소 유의 바이트를 저장합니다.바이엔디안은 데이터 가져오기 및 저장 시 또는 명령 가져오기용으로 전환 가능한 엔디안을 특징으로 하는 수많은 컴퓨터 아키텍처에서 지원되는 기능입니다.다른 순서는 일반적으로 미들엔디안 [4][5][6][7]또는 믹스엔디안이라고 불립니다.
엔디안니스(endianness)는 비트가 통신채널을 통해 전송되는 순서를 설명하기 위해서도 사용할 수 있다.예를 들어 통신채널의 빅엔디안이 가장 중요한 비트를 먼저 [8]전송한다.비트 엔디안은 다른 컨텍스트에서는 거의 사용되지 않습니다.
어원학
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Gullivers_travels.jpg/220px-Gullivers_travels.jpg)
Danny Cohen은 1980년에 [9]발행된 인터넷 실험 노트(Internet Experiment Note)에서 데이터 정렬을 위해 컴퓨터 과학에 빅 엔디언과 리틀 엔디언이라는 용어를 도입했습니다.
형용사 엔디안은 18세기 영국계 아일랜드 작가 조나단 스위프트의 글에서 유래했다.1726년 소설 걸리버 여행기에서 그는 삶은 달걀의 껍질을 깨는 종파와 작은 종파로 나뉜 릴리푸트 종파 간의 갈등을 그렸다.그는 그들을 빅엔디언과 [10][11]리틀엔디언이라고 불렀다.코헨은 1980년 노트의 부록에 걸리버 여행과의 연관성을 분명히 했다.
개요
컴퓨터는 다양한 크기의 이진 비트 그룹으로 정보를 저장합니다.각 그룹에는 컴퓨터가 해당 데이터에 액세스하는 데 사용하는 주소라는 번호가 할당됩니다.대부분의 현대 컴퓨터에서 주소를 가진 가장 작은 데이터 그룹은 8비트 길이이며 바이트라고 불립니다.큰 그룹은 2바이트 이상으로 구성됩니다.예를 들어 32비트 워드에는 4바이트가 포함됩니다.컴퓨터가 더 큰 그룹의 개별 바이트에 번호를 매기는 방법은 두 가지가 있습니다(양쪽 끝에서 시작).두 가지 유형의 엔디안니스 모두 디지털 전자 공학에서 널리 사용되고 있습니다.새로운 설계의 엔디안니스에 대한 초기 선택은 종종 제멋대로이지만, 이후 기술 개정 및 업데이트는 하위 호환성을 유지하기 위해 기존의 엔디안니스 상태를 영속화합니다.
하드웨어는 데이터를 저장 및 로드하기 위해 동일한 엔디안을 일관되게 사용하기 때문에 내부적으로는 어떤 엔디안을 사용하든 상관없이 컴퓨터가 동일하게 작동합니다.이러한 이유로 프로그래머와 컴퓨터 사용자는 일반적으로 작업 중인 컴퓨터의 엔디안을 무시합니다.단, 다른 컴퓨터 간에 데이터를 전송할 때처럼 컴퓨터 외부로 데이터를 이동하거나 메모리 덤프에서 내부 컴퓨터 바이트의 데이터를 조사하는 프로그래머가 사용되는 엔디안성은 예상과 다를 수 있습니다.이러한 경우 데이터의 엔디안성을 이해하고 설명해야 한다.
이 두 그림은 서로 다른 엔디안니스(Endianness)를 사용하는 두 컴퓨터가 32비트(4바이트) 정수를 저장하는 방법을 보여줍니다.0x0A0B0C0D어느 경우든 정수는 4바이트(0x0A, 0x0B, 0x0C 및 0x0D)로 분할되어 주소 a의 메모리 위치에서 시작하여 a + 1, a + 2, a + 3의 순서로 메모리의 4바이트 위치에 저장됩니다.big endian과 little endian의 차이는 저장되는 정수의 4바이트 순서입니다.
왼쪽 그림은 빅 엔디안을 사용하는 컴퓨터입니다.그러면 주소 a에서 최상위 바이트인 0x0A의 정수가 저장되기 시작하여 주소 a + 3에서 최하위 바이트인 0x0D로 끝납니다.
오른쪽 그림은 리틀 엔디안을 사용하는 컴퓨터를 나타냅니다.그러면 주소 a에서 최하위 바이트인 0x0D의 정수가 저장되기 시작하여 주소 a + 3에서 최상위 바이트인 0x0A로 종료됩니다.
각 컴퓨터는 동일한 엔디안성을 사용하여 정수를 저장 및 검색하므로 결과는 두 컴퓨터에서 동일합니다.메모리 주소가 정수가 아닌 바이트로 지정되거나 메모리 내용이 다른 컴퓨터 간에 전송될 때 문제가 발생할 수 있습니다.
빅 엔디안은 인터넷 프로토콜 스위트와 같은 네트워킹 프로토콜에서 가장 중요한 바이트를 먼저 전송하는 네트워크 순서입니다.반대로, 프로세서 아키텍처(x86, 대부분의 ARM 구현, 기본 RISC-V 구현) 및 관련 메모리에 대해서는 little-endianness가 주요 순서입니다.파일 형식에는 두 가지 순서를 사용할 수 있습니다.일부 형식에는 두 가지 순서가 혼재되어 있거나 [12]파일 전체에서 사용되는 표시기가 포함되어 있습니다.
리틀 엔디안과 빅 엔디안의 스타일은 예를 들어 숫자 시스템의 숫자나 날짜의 섹션과 같은 표현의 순서를 특징짓기 위해 더 일반적으로 사용될 수도 있다.위치 표기의 숫자는 일반적으로 왼쪽에서 오른쪽으로 빅엔디안 순서로 숫자를 사용하여 쓰입니다.오른쪽에서 왼쪽으로 스크립트가 되어 있는 경우에도 마찬가지입니다.마찬가지로 프로그래밍 언어에서도 숫자 리터럴에 빅 엔디안 자리 순서를 사용합니다.
기본
컴퓨터 메모리는 일련의 스토리지 셀(주소 지정 가능한 최소 단위)로 구성됩니다. 바이트 어드레싱을 지원하는 기계에서는 이러한 단위를 바이트라고 합니다.각 바이트는 메모리 주소로 하드웨어 및 소프트웨어에서 식별 및 액세스됩니다.메모리내의 합계 바이트수가 n인 경우, 주소는 0 ~n - 1 의 범위에서 열거됩니다.
컴퓨터 프로그램은 종종 1바이트에 저장할 수 있는 것보다 더 많은 데이터로 구성될 수 있는 데이터 구조나 필드를 사용합니다.이 문서에서는 유형을 임의로 복잡하게 할 수 없는 상황에서 "필드"는 연속된 바이트 시퀀스로 구성되며 "단순한 데이터 값"을 나타냅니다.이 값은 적어도 하나의 하드웨어 명령으로 조작할 수 있습니다.대부분의 시스템에서 멀티바이트 단순 데이터 값의 주소는 첫 번째 바이트 주소(주소가 [note 1]가장 작은 바이트)입니다.
바이트가 "필드"의 일부가 되는 또 다른 중요한 속성은 "중요성"입니다.필드 부분의 이러한 속성은 컴퓨터 하드웨어에 의해, 보다 정확하게는 컴퓨터 명령의 결과에 기여하는 낮은 수준의 알고리즘에 의해 바이트가 액세스되는 시퀀스에서 중요한 역할을 합니다.
숫자
위치 번호 시스템(대부분의 경우 2진법 또는 10진법[note 2])은 정수 데이터를 컴퓨터에 의해 표현하는 주요 방법이며, 특히 정수 데이터를 조작하는 방법입니다.순수한 형태에서 이는 음이 아닌 중간 크기의 정수(예: C 데이터 유형)에 유효하다.unsigned
이러한 번호 체계에서는, 1 자리수의 값이 1 자리수의 값 뿐만이 아니라, 1 자리수의 위치(의미도)에 의해서도 결정된다.이러한 위치는 주로 다음 두 [13]가지 방법으로 메모리에 매핑할 수 있습니다.
- 메모리 주소(또는 시간 증가)의 증가와 함께 수치적 유의성 감소(빅 엔디안 및
- little-endian으로 [note 3]알려진 메모리 주소(또는 시간 증가)의 증가에 따라 수치적 중요성이 증가합니다.
컴퓨터 하드웨어에 의해 직접 지원되는 정수 데이터는 저전력 2의 고정폭을 가집니다.예를 들어 8비트 1 1바이트, 16비트 2 2바이트, 32비트 4 4바이트, 64비트≙ 8바이트, 128비트 16 16바이트입니다.이러한 필드의 바이트에 대한 낮은 수준의 액세스시퀀스는 실행하는 조작에 따라 달라집니다.최하위 바이트는 덧셈, 뺄셈 및 곱셈을 위해 먼저 액세스됩니다.가장 중요한 바이트는 나눗셈 및 비교를 위해 먼저 액세스됩니다.② 계산순서를 참조해 주세요.
부동소수점수에 대해서는, 「부동소수점」을 참조해 주세요.
본문
예를 들어 정렬과 같은 일부 메커니즘을 지원하기 위해 문자(텍스트) 문자열을 서로 비교할 때 이는 사전 편찬적으로 수행되며 단일 위치 요소(문자)도 위치 값을 가집니다.사전 비교는 거의 모든 곳에서 이루어집니다. 전화번호부에서처럼 [note 4]첫 글자가 가장 높은 순위를 차지합니다.
텍스트로 작성된 정수 번호는 항상 메모리에서 최상위 자리 먼저 표시되며, 이는 텍스트 방향과는 독립적으로 빅 엔디안과 유사합니다.
하드웨어
과거의 프로세서나 현재의 프로세서는, Big-endian 메모리 표현을 배타적 또는 설계 옵션으로 사용하고 있습니다.다른 프로세서 타입은 리틀 엔디안 메모리 표현을 사용합니다.또 다른 타입은 미들 엔디안, 믹스 엔디안 또는 PDP-11 엔디안이라고 불리는 다른 스킴을 사용합니다.
일부 명령 집합에는 데이터 가져오기 및 저장, 명령 가져오기 또는 둘 다에서 전환 가능한 엔디안성을 허용하는 설정이 있습니다.이 기능은 성능을 향상시키거나 네트워킹 장치 및 소프트웨어의 로직을 단순화할 수 있습니다.하드웨어에 대해 bi-endian이라는 단어는 두 가지 형식의 데이터를 계산하거나 전달할 수 있는 기계의 능력을 나타냅니다.
엔디안성이 다른 데이터를 처리하는 것을 NUXI [14]문제라고 부르기도 합니다.이 용어는 적응 중에 발생하는 바이트 순서 경합을 나타냅니다.UNIX는 혼합 엔디안 PDP-11에서 [note 5]실행되며 빅 엔디안 IBM Series/1 컴퓨터에 연결됩니다.Unix는 내부 표현이 다른 플랫폼에 대해 동일한 코드를 컴파일할 수 있도록 한 최초의 시스템 중 하나입니다.가장 먼저 변환된 프로그램 중 하나는 인쇄하기로 되어 있었다.Unix
단, 시리즈/1에서는 인쇄되어 있습니다.nUxi
대신.[15]
IBM System/360은 후속 제품인 System/370, ESA/390 및 z/Architecture와 마찬가지로 빅 엔디언 바이트 순서를 사용합니다.PDP-10에서는 바이트 지향 명령에 빅엔디안 어드레싱을 사용합니다.IBM Series/1 미니컴퓨터는 빅 엔디언 바이트 순서를 사용합니다.
Datapoint 2200에서는 반송 전파를 용이하게 하기 위해 리틀엔디안이 있는 단순한 비트시리얼 로직을 사용했습니다.인텔은 데이터 포인트용 8008 마이크로프로세서를 개발했을 때 호환성을 위해 리틀 엔디안을 사용했습니다.그러나 인텔이 8008을 제때 제공할 수 없었기 때문에 Datapoint는 중간 규모의 통합 기능을 사용했지만 MCS-48과 8086 및 x86 후계기 [16][17]등 대부분의 인텔 설계에서는 리틀 엔디안이 유지되었습니다.DEC Alpha, Atmel AVR, VAX, MOS Technology 6502 패밀리(Western Design Center 65802 및 65C816 포함), Zilog Z80(Z180 및 eZ80 포함), Altera Nios II 및 기타 많은 프로세서 및 프로세서 패밀리도 리틀 엔디안입니다.
Motorola 6800/6801, 6809 및 68000 시리즈의 프로세서는 빅 엔디언 포맷을 사용했습니다.
인텔 8051은 다른 인텔 프로세서와 달리 LJMP 및 LCALL의 16비트주소를 빅엔디안 형식으로 상정하고 있습니다만, xCALL 명령은 반환 주소를 리틀엔디안 [18]형식으로 스택에 저장합니다.
SPARC는 바이엔디안 버전9까지 빅엔디안을 사용했습니다.
마찬가지로 초기 IBM POWER 프로세서도 빅엔디안이었지만 PowerPC와 Power ISA의 후속 제품은 이제 바이엔디안입니다.
ARM 아키텍처는 바이엔디안이 된 버전3 이전에는 리틀엔디안이었습니다.
새로운 아키텍처
IA-32 및 x86-64 명령 집합 아키텍처는 리틀 엔디언 형식을 사용합니다.이 규칙을 따르는 기타 명령어세트 아키텍처에는 Nios II, Andes Technology NDS32 및 Qualcomm Hexagon 등이 있습니다.
IBM z/Architecture 및 OpenRISC가 포함된 빅 엔디안 아키텍처만 해당됩니다.
Power ISA, SPARC, ARM AArch64, C-Sky 및 RISC-V를 비롯한 일부 명령 집합 아키텍처는 "바이엔디안"이며 두 가지 엔디안 소프트웨어를 실행할 수 있습니다. IBM AIX 및 IBM i는 바이엔디안 Power ISA에서 빅엔디안 모드로 실행되며 Linux는 2019년에 빅엔디안 모드로 실행되었습니다.Linux 소프트웨어를 [19][20]x86에서 Power로 변경합니다.SPARC는 Oracle Solaris와 Linux 모두 바이엔디안 SPARC 시스템에서 빅엔디안 모드로 실행되기 때문에 관련된 리틀엔디안 도입은 없습니다.실제로는 빅엔디안으로 간주할 수 있습니다.ARM, C-Sky 및 RISC-V는 관련된 빅엔디안 전개가 없으며 실제로는 리틀엔디안으로 간주될 수 있습니다.
이중 엔디안성
ARM 버전 3 이후, PowerPC, Alpha, SPARC V9, MIPS, 인텔 i860, PA-RISC, SuperH SH-4 및 IA-64 등 일부 아키텍처에서는 데이터 가져오기 및 저장, 명령 가져오기 또는 둘 다에서 전환 가능한 엔디안 설정을 갖추고 있습니다.이 기능은 성능을 향상시키거나 네트워킹 장치 및 소프트웨어의 로직을 단순화할 수 있습니다.하드웨어에 대해 bi-endian이라는 단어는 두 가지 형식의 데이터를 계산하거나 전달할 수 있는 기계의 능력을 나타냅니다.
이러한 아키텍처의 대부분은 소프트웨어를 통해 특정 엔디안 포맷(일반적으로 컴퓨터 부팅 시)으로 전환할 수 있습니다.단, 일부 시스템에서는 기본 엔디안은 메인보드의 하드웨어에 의해 선택되며 소프트웨어(예를 들어 Cray T3E의 빅 엔디안 모드에서만 실행되는 Alpha)를 통해 변경할 수 없습니다.
bi-endian이라는 용어는 주로 프로세서가 데이터 액세스를 처리하는 방식을 가리킵니다.인텔의 IA-64 베이스의 Itanium CPU 등, 데이터 액세스가 완전하게 바이엔디안인 경우에서도, 소정의 프로세서상의 명령어 액세스(명령어 페치)는 고정 엔디안을 상정하고 있는 경우가 있습니다.
또한 일부 명목상 바이엔디안 CPU는 엔디안을 완전히 전환하기 위해 메인보드가 필요합니다.예를 들어 리틀 엔디언 모드의 32비트 데스크톱 지향 PowerPC 프로세서는 실행 중인 프로그램의 관점에서 리틀 엔디언으로 동작하지만, I/O 디바이스에 대해 리틀 엔디언 뷰를 적용하기 위해서는 메인보드가 모든 8바이트 레인에 대해 64비트 스왑을 실행해야 합니다.이 비정상적인 메인보드 하드웨어가 없는 경우 디바이스 드라이버 소프트웨어는 불완전한 변환을 취소하기 위해 다른 주소에 쓰기를 수행해야 하며 일반 바이트 스왑도 수행해야 합니다.
임베디드 기기용 PowerPC 프로세서와 거의 모든 SPARC 프로세서 등 일부 CPU에서는 페이지 단위로 엔디안을 선택할 수 있습니다.
1990년대 후반 이후의 SPARC 프로세서(SPARC v9 준거 프로세서)에 의해, 메모리로부터 로드 또는 메모리에 보존하는 각 명령으로 데이터 엔디안을 선택할 수 있습니다.
ARM 아키텍처는 BE-8과 [21]BE-32라는2개의 빅엔디안 모드를 지원합니다.ARMv5까지의 CPU는 BE-32 또는 워드 불변 모드만 지원합니다.여기서 자연스럽게 정렬된32비트 액세스는 리틀엔디언 모드와 같이 동작하지만 바이트 또는 16비트 워드에 대한 액세스는 대응하는 주소로 리다이렉트되어 비정렬 액세스는 허용되지 않습니다.ARMv6에서는 BE-8 또는 바이트 불변 모드가 도입되어 있습니다.이 모드에서는 단일 바이트에 대한 액세스는 리틀 엔디언 모드로 동작하지만 16비트, 32비트 또는 (ARMv8)64비트 워드에 액세스하면 데이터의 바이트 스왑이 발생합니다.이것에 의해, 비정렬 메모리 액세스와 32비트 이외의 레지스터에의 메모리 매핑 액세스가 심플화됩니다.
많은 프로세서는 레지스터 내의 워드를 반대쪽 엔디안니스로 변환하는 명령을 가지고 있습니다.즉, 바이트 순서를 16비트, 32비트 또는 64비트 워드로 교환합니다.단, 모든 비트가 반전되는 것은 아닙니다.
최신 인텔 x86 및 x86-64 아키텍처 CPU에는 MOVBE 명령어가 있습니다(4세대부터 인텔 Core, [22]ATOM 이후의 인텔 Core).이 명령어는 메모리에서 빅 엔디안 형식의 워드를 가져오거나 빅 엔디안 형식의 워드를 메모리에 씁니다.이 프로세서들은 그 외에는 완전히 리틀엔디안입니다.
다른 장소에서 다른 형식을 사용하는 장치도 있습니다.예를 들어, BQ27421 Texas Instruments 배터리 게이지는 레지스터에 리틀 엔디언 형식을 사용하고 랜덤 액세스 메모리에 빅 엔디언 형식을 사용합니다.이 동작은 변경할 수 없는 것 같습니다.
부동 소수점
많은 프로세서가 모든 유형의 데이터(정수, 부동소수점)에 대해 리틀 엔디언 스토리지를 사용하지만 부동소수점 숫자는 빅 엔디언 형식으로 표현되고 정수는 리틀 엔디언 [23]형식으로 표현되는 하드웨어 아키텍처가 많이 있습니다.ARM 프로세서는 2배 정밀도의 숫자를 little-endian, big-endian 부동소수점 표현으로 나타낸 것이 있습니다.두 32비트 워드 모두 정수 레지스터와 같이 little-endian으로 저장되지만 가장 중요한 것은 첫 번째입니다.VAX 부동소수점에서는 리틀 엔디안 16비트 워드를 빅 엔디안 순서로 저장합니다.네트워크 표준 표현이 없는 부동소수점 형식이 다수 존재하기 때문에 XDR 표준에서는 빅엔디안 IEEE 754를 표현으로 사용합니다.따라서 광범위한 IEEE 754 부동소수점 표준이 엔디안을 지정하지 않는 것은 [24]이상하다고 생각될 수 있습니다.이론적으로 이는 한 머신에 의해 작성된 표준 IEEE 부동소수점 데이터조차 다른 머신에 의해 판독되지 않을 수 있음을 의미합니다.그러나, 현대의 표준 컴퓨터(즉, IEEE 754의 실장)에서는, 엔디안니스(endianness)는 정수와 부동소수점수가 동일하다고 가정할 수 있어 데이터 타입에 관계없이 변환이 간단하다.그러나 특별한 부동소수점 형식을 사용하는 소형 임베디드 시스템은 다른 문제일 수 있습니다.
가변 길이 데이터
지금까지 고려된 대부분의 명령어에는 오퍼랜드의 크기(길이)가 오퍼 코드 내에 포함되어 있습니다.자주 사용할 수 있는 오퍼랜드의 길이는 1, 2, 4, 8, 또는 16바이트입니다.그러나 명령의 별도 필드 또는 피연산자 자체에 피연산자의 길이를 유지할 수 있는 아키텍처도 있다(예를 들어 워드마크).이 방법에서는 오퍼랜드 길이가 최대 256바이트 이상까지 허용됩니다.이러한 오퍼랜드의 데이터 유형은 문자열 또는 BCD입니다.하나의 명령(예: 비교, 추가)으로 이러한 데이터를 조작할 수 있는 기계에는 IBM 1401, 1410, 1620, System/360, System/370, ESA/390 및 z/Architecture가 모두 빅 엔디안 유형입니다.
필드의 일부에 대한 간단한 액세스
대부분의 시스템에서 멀티바이트 값의 주소는 첫 번째 바이트(최저 주소의 바이트)의 주소입니다.그 타입의 리틀 엔디언 시스템은 충분히 낮은 데이터 값에 대해 다른 주소를 사용하지 않고 동일한 값을 다른 길이로 메모리에서 읽을 수 있는 속성을 가집니다(얼라인먼트 제한이 없는 경우에도).ed) 예를 들어 32비트 메모리 위치(콘텐츠 포함)와 같은 경우4A 00 00 00
는 8비트(값 = 4A), 16비트(004A), 24비트(00004A) 또는 32비트(00004A)와 동일한 주소에서 읽을 수 있으며 모두 동일한 숫자 값을 유지합니다.이 little-endian 속성은 고급 프로그래머에 의해 직접 사용되는 경우는 거의 없지만 코드 옵티마이저 및 어셈블리 언어 프로그래머에 [examples needed]의해 사용되는 경우가 있습니다.
보다 구체적으로 말하면, 이와 같은 ID는 대부분의 리틀 엔디안 시스템에서 true를 반환하는 다음 C 코드와 동일합니다.
조합 { uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64; } u = { .u64 = 0x4A }; 놓다(u.u8 == u.u16 & & u.u8 == u.u32 & & u.u8 == u.u64 ? "진짜" : "false");
C++에서는 허용되지 않지만 이러한 유형의 펀닝 코드는 C11 표준에[25] 의해 "실장 정의"로 허용되며 [27]하드웨어와[26] 상호작용하는 코드에서 일반적으로 사용됩니다.
한편, 경우에 따라서는 완전한 표현 대신 가장 중요한 부분만을 읽어냄으로써 멀티바이트 또는 멀티워드 값의 근사치를 얻는 것이 유용할 수 있습니다.빅 엔디언 프로세서는 전체 값에 사용되는 것과 동일한 베이스 주소를 사용하여 이러한 근사치를 읽을 수 있습니다.
물론 이러한 종류의 단순화는 서로 다른 엔디안성을 가진 시스템 간에 이식할 수 없습니다.
계산순서
위치 번호 시스템의 일부 연산은 기본 단계가 실행되는 자연 또는 선호 순서를 가집니다.이 순서는 소규모 바이트 주소 지정 가능한 프로세서 및 마이크로 컨트롤러의 성능에 영향을 줄 수 있습니다.그러나 고성능 프로세서는 보통 1바이트를 가져오는 것과 같은 시간 내에 메모리에서 멀티바이트 피연산자를 가져오기 때문에 하드웨어의 복잡성은 바이트 순서에 영향을 받지 않습니다.
덧셈, 뺄셈 및 곱셈은 최하위 자리수 위치에서 시작하여 이후의 보다 유의한 위치로 반송파를 전파합니다.대부분의 시스템에서 멀티바이트 값의 주소는 첫 번째 바이트 주소(주소가 가장 작은 바이트)입니다.첫 번째 바이트에 최하위 숫자가 포함되어 있는 리틀 엔디언 머신을 사용하면 이러한 작업의 구현이 약간 더 간단해집니다.
비교와 나눗셈은 가장 유의한 자리수부터 시작하여 가능한 자리수를 그 이후의 유의하지 않은 자리수로 전파합니다.고정길이 수치(일반적으로 길이 1,2,4,8,16)의 경우 빅엔디안 머신에서 이들 조작의 실장은 다소 간단합니다.
일부 빅 엔디안 프로세서(예: IBM System/360 및 그 후속 프로세서)에는 다양한 길이의 문자열을 사전 편찬적으로 비교하는 하드웨어 명령이 포함되어 있습니다.
할당문에 의한 통상적인 데이터 전송은 원칙적으로 프로세서의 엔디안과는 무관합니다.
미들엔디안
일반적으로 미들엔디안 또는 믹스엔디안이라고 불리는 수많은 다른 순서가 가능합니다.
PDP-11은 원칙적으로 16비트 리틀엔디안 시스템입니다PDP-11/45, PDP-11/70의 옵션 부동소수점 프로세서 및 일부 이후의 프로세서에서는 부동소수점 값과 정수 값 간에 변환하는 명령에서는 32비트의 "이중 정밀도 정수 길이" 값이 저장되었으며 16비트의 반이 예상되는 리틀엔디안 순서에서 스왑되었습니다.UNIX C 컴파일러는 32비트 길이의 정수에 동일한 형식을 사용했습니다.이 순서를 PDP 엔디안이라고 [28]합니다.
이 endianness를 해석하는 방법은 32비트 정수를 2개의 빅엔디안 16비트 단어로 저장하고 little-endian 단어 순서를 지정하는 것입니다.
주소 증가 → | |||||
0Bh | 0Ah | 0Dh | 0Ch | ||
0A0Bh | 0C0Dh |
여기서의 16비트 값은 실제 레이아웃이 아닌 수치입니다.
IA-32 및 호환되는 프로세서의 세그먼트 기술자는 기술자 [29]시작의 상대 위치 2, 3, 4, 7에 리틀 엔디안 순서로 저장되지만 연속되지 않은4 바이트 단위로 세그먼트의 32비트 베이스 주소를 유지합니다.
엔디안 날짜
날짜는 년, 월, 일의 순서로 다른 엔디안으로 나타낼 수 있습니다.예를 들어 2002년 9월 12일은 다음과 같이 나타낼 수 있습니다.
- little-endian 날짜(일, 월, 년), 2002년 12월 9일
- 중간 날짜(월, 일, 년), 2002년 9월 12일
- ISO 8601과 마찬가지로 2002-09-12 빅엔디안 날짜
미국의 날짜 및 시간 표기법에서는 날짜는 중간이며 전 세계 날짜 형식과 다릅니다.
바이트 어드레싱
메모리 바이트가 왼쪽에서 오른쪽으로 순차적으로 인쇄되는 경우(16진수 덤프 등), 정수의 리틀엔디안 표현은 왼쪽에서 오른쪽으로 증가합니다.즉, 시각화할 때 거꾸로 나타나며, 이는 직관에 반할 수 있습니다.
예를 들어, 이 동작은, FourCC등의 테크놀로지에서는, 문자를 정수로 패킹 하는 것으로, 메모리내의 특정 문자의 시퀀스가 됩니다.표기법을 정의합시다.'John'
단순히 16진수 ASCII로 문자를 쓰고 추가함으로써0x
다음과 같이 짧은 시퀀스(유닉스/MacOS 스타일의 C 멀티문자 리터럴):
' Jo h n ' 16진수 4A 6F 68 6E -----------------> 0x4A6F686E
빅 엔디언 머신에서는 결과를 읽기 위한 올바른 문자열 순서와 일치하는 값이 왼쪽에서 오른쪽으로 표시됩니다.
주소 증가 → | |||||
4Ah | 6층h | 68h | 6Eh | ||
'J' | o | '하' | 'n' |
하지만 리틀 엔디언 기계에서는 다음과 같은 것을 볼 수 있습니다.
주소 증가 → | |||||
6Eh | 68h | 6층h | 4Ah | ||
'n' | '하' | o | 'J' |
예를 들어 PDP-11에서는 32비트 값이 2개의 16비트 단어 'Jo' 'hn'으로 빅엔디안으로 저장되고 16비트 단어 내의 문자는 리틀엔디안으로 저장됩니다.
주소 증가 → | |||||
6층h | 4Ah | 6Eh | 68h | ||
o | 'J' | 'n' | '하' |
바이트 스왑
바이트 스왑은 각 바이트를 마스킹하고 올바른 위치로 이동하는 것으로 구성됩니다.대부분의 컴파일러는 네이티브 프로세서 명령어로 컴파일될 가능성이 높은 빌트인을 제공하고 있습니다.bswap
/movbe
예를 들어 다음과 같습니다.__builtin_bswap32
. 스와프용 소프트웨어 인터페이스는 다음과 같습니다.
- 표준 네트워크 엔디안니스 기능(최대 32비트)[30]Windows 의 확장자는 64비트입니다.
winsock2.h
. - BSD 및 Glibc
endian.h
기능(BE 및 LE에서 시작/종료, 최대 64비트)[31] - MacOS
OSByteOrder.h
매크로(BE 및 LE에서 시작/종료, 최대 64비트)
파일 및 파일 시스템
엔디안니스 인식은 엔디안니스성이 다른 컴퓨터에서 작성된 파일 또는 파일 시스템을 읽을 때 중요합니다.
일부 CPU 명령 집합은 다음과 같은 엔디안 바이트 스왑을 기본적으로 지원합니다.bswap
[32] (x86-486 이후),rev
[33] (ARMv6 이후).
일부 컴파일러에는 바이트 스왑 기능이 내장되어 있습니다.예를 들어 인텔 Fortran 컴파일러는 비표준을 지원합니다.CONVERT
파일을 열 때 지정자를 지정합니다. 예: OPEN(unit, CONVERT='BIG_ENDIAN',...)
.
일부 컴파일러에는 모든 파일 IO 작업에 대해 글로벌하게 변환을 가능하게 하는 코드를 생성하는 옵션이 있습니다.이를 통해 코드 수정 없이 반대쪽 엔디안성을 가진 시스템에서 코드를 재사용할 수 있습니다.
Fortran은 일반적으로 데이터의 바이트 수와 동일한 정수인 카운트 필드의 선두 및 후속 데이터로서 레코드(단일 Fortran 문에 의해 작성된 데이터로 정의됨)를 구현하기 때문에 한 엔디안니스로 작성된 Fortran 순차 비포맷 파일은 다른 엔디안니스로 시스템에서 읽을 수 없습니다.다른 endianness 시스템에서 Fortran을 사용하여 이러한 파일을 읽으려고 하면 카운트 필드가 잘못되었기 때문에 런타임 오류가 발생합니다.이 문제는 포맷되지 않은 순차적 이진 파일이 아닌 순차적 이진 파일을 쓰는 것으로 방지할 수 있습니다.그러나 Fortran 레코드 및 데이터를 읽을 때 Fortran의 엔디안니스에서 변환하여 Fortran의 순차적 비포맷 파일을 구문 분석하고 이를 "원어" 엔디안으로 변환하는 다른 언어(예: C 또는 Python)로 프로그램을 작성하는 것은 비교적 간단하다는 점에 유의하십시오.
Unicode 텍스트는 선택적으로 BOM(바이트 순서 마크)으로 시작하여 파일 또는 스트림의 엔디안함을 알릴 수 있습니다.코드 포인트는 U+FEF입니다.예를 들어 UTF-32에서는 빅 엔디안파일은00 00 FE FF
little-endian은 로 시작해야 합니다.FF FE 00 00
.
애플리케이션 바이너리 데이터 형식(예: MATLAB .mat 파일 또는 지형학에서 사용되는 .bil 데이터 형식)은 일반적으로 엔디안니스에 의존하지 않습니다.이것은 데이터를 항상 하나의 고정 엔디엔드로 저장하거나 엔디엔드로 표시하기 위한 스위치를 데이터와 함께 운반함으로써 실현됩니다.
첫 번째 예로는 Windows와 Mac 시스템 간에 휴대 가능하며 항상 리틀 엔디안인 바이너리 XLS 파일 포맷을 들 수 있습니다.Mac 응용 프로그램은 로드 시 바이트를 스왑하여 빅 엔디안 Motorola 68K 또는 PowerPC [34]프로세서에서 실행할 때 저장합니다.
TIFF 이미지 파일은 두 번째 전략의 한 예입니다.헤더는 내부 바이너리 정수의 엔디안니스에 대해 어플리케이션에 지시합니다.파일이 서명으로 시작하는 경우MM
이는 정수가 빅엔디안으로 표현되는 반면II
리틀엔디안을 의미합니다.이러한 시그니처는 각각1개의 16비트 워드를 필요로 하며, 회문(즉, 앞뒤로 같은 읽음)이기 때문에 엔디안니스에 의존하지 않습니다. I
Intel과M
는 1980년대 IBM PC 호환기(Intel) 및 Apple Macintosh 플랫폼(Motorola)의 각 CPU 공급자인 Motorola를 의미합니다.인텔 CPU는 리틀 엔디안이고, Motorola 680x0 CPU는 빅 엔디안입니다.이 명시적 시그니처는, 엔디안이 다른 컴퓨터상에서 실행되고 있는 TIFF 라이터 프로그램에 의해서 특정의 파일이 생성되었을 경우에, 필요에 따라서 TIFF 리더 프로그램이 바이트를 스왑 할 수 있도록 합니다.
인텔 8080 플랫폼에 최초로 실장된 결과, 운영체제에 의존하지 않는 파일 할당 테이블(FAT) 파일 시스템은 다른 엔디안을 네이티브로 사용하는 플랫폼에서도 리틀 엔디안 바이트 순서로 정의되어 있기 때문에 FAT 유지보수를 위해 바이트 스왑 조작이 필요합니다.
파일 시스템과 논리 볼륨 관리자를 결합한 ZFS는 적응형 엔디안을 제공하고 빅 엔디안과 리틀 엔디안 [35]시스템 모두에서 작동하는 것으로 알려져 있습니다.
네트워킹
많은 IETF RFC에서는 네트워크 순서라는 용어를 사용합니다.이것은 네트워크 프로토콜에서 회선을 통한 비트 및 바이트 전송 순서를 의미합니다.무엇보다도, 역사적인 RFC 1700(인터넷 표준 STD 2)은 인터넷 프로토콜 스위트의 프로토콜에 대한 네트워크 순서를 빅 엔디안으로 정의했습니다. 따라서 빅 엔디안 바이트 [36]순서에 "네트워크 바이트 순서"라는 용어를 사용합니다.
그러나 모든 프로토콜이 빅 엔디언 바이트 순서를 네트워크 순서로 사용하는 것은 아닙니다.SMB(Server Message Block) 프로토콜은 리틀 엔디언 바이트 순서를 사용합니다.CANopen에서는 멀티바이트 파라미터가 항상 최하위 바이트 먼저 전송됩니다(리틀 엔디안).Ethernet Powerlink도 [37]마찬가지입니다.
버클리 소켓API는 네트워크 바이트 순서로 16비트 및 32비트 정수를 변환하는 함수 세트를 정의합니다.htons
(호스트에서 네트워크로의 쇼트)및htonl
(호스트에서 네트워크로 긴) 함수는 각각 16비트 및 32비트 값을 머신(호스트)에서 네트워크 순서로 변환합니다.ntohs
그리고.ntohl
함수는 네트워크에서 호스트 [38][39]순서로 변환됩니다.이러한 기능은 빅 엔디안 시스템에서는 작동하지 않을 수 있습니다.
높은 수준의 네트워크 프로토콜은 일반적으로 바이트(대부분 옥텟으로 의미)를 원자 단위로 간주하는 반면, 가장 낮은 네트워크 프로토콜은 바이트 내의 비트 순서를 다룰 수 있다.
비트 엔디안니스
비트 넘버는 엔디안니스와 유사한 개념이지만 바이트가 아닌 비트 수준입니다.비트 엔디안니스 또는 비트레벨 엔디안니스란 시리얼 미디어를 통한 비트 전송 순서를 말합니다.little-endian의 비트 레벨 아날로그(최소 중요 비트가 먼저 간다)는 RS-232, HDLC, 이더넷 및 USB에서 사용됩니다. 일부 프로토콜은 반대 순서(예: Teletext, IC2, SMBus, PMBus, SONET 및 SDH[40])를 사용하고 ARINC 429는 나머지 하나를 필드 순서와 라벨 순서 지정에 사용합니다.보통 바이트의 순서에 관계없이 비트에 일관된 뷰가 존재하기 때문에 바이트의 순서는 매우 낮은 레벨에서만 관련됩니다.한 가지 예외는 기존의 길이까지의 모든 버스트에러를 검출하는 일부 사이클릭 용장성 체크의 기능에 의해 발생합니다.이는 시리얼 전송의 바이트 순서와 비트 순서가 다르면 망가집니다.
각 비트가 고유한 주소를 갖는 컴퓨터 아키텍처는 드물기 때문에 직렬화 외에 비트 엔디안니스와 비트 레벨 엔디안니스라는 용어는 거의 사용되지 않습니다.개별 비트 또는 비트필드는 수치 또는 상위 프로그래밍 언어에서는 할당된 이름을 통해 액세스됩니다. 단, 그 영향은 기계에 의존하거나 소프트웨어 이식성이 결여될 수 있습니다.
메모들
- ^ 이 규칙의 예외는 예를 들어 IBM 1401의 Add 명령입니다. IBM 1401은 가변 길이 필드를 하위(주소가 가장 높은) 위치에 지정하고 길이는 상위(주소가 가장 낮은) 위치에 설정된 워드 마크에 의해 정의됩니다.덧셈 등의 조작이 실행되면 프로세서는 2개의 필드의 상위 주소의 하위 위치에서 시작하여 상위 위치까지 동작합니다.
- ^ BCD로 인코딩된 경우 base 10은 endianness와 관련될 수 있습니다.
- ^ 이러한 표현에서 "끝"이라는 용어는 큰 응답이 있는 극단을 의미합니다.의미가 거의 없다, 즉 그 분야가 어디서 시작되느냐는 것이다.
- ^ 1개의 명령만을 사용하여 이 작업을 수행할 수 있는 거의 모든 기계( variable 가변장 데이터 참조)는 Big-Endian 또는 적어도 혼합 엔디안 유형입니다.
- ^ PDP-11 아키텍처는 네이티브인 16비트 워드 내의 리틀엔디안이지만 32비트 데이터는 특이한 빅엔디안 워드 쌍으로 저장됩니다.
레퍼런스
- ^ 큰 바이트 순서와 작은 엔디안 바이트 순서 이해
- ^ 바이트 순서 PPC
- ^ C에 endian 독립 코드를 쓰는 중
- ^ "Internet Hall of Fame Pioneer". Internet Hall of Fame. The Internet Society.
- ^ Cary, David. "Endian FAQ". Retrieved 2010-10-11.
- ^ James, David V. (June 1990). "Multiplexed buses: the endian wars continue". IEEE Micro. 10 (3): 9–21. doi:10.1109/40.56322. ISSN 0272-1732. S2CID 24291134.
- ^ Blanc, Bertrand; Maaraoui, Bob (December 2005). "Endianness or Where is Byte 0?" (PDF). Retrieved 2008-12-21.
{{cite journal}}
:Cite 저널 요구 사항journal=
(도움말) - ^ "RFC 1700".
- ^ 코헨, 대니(1980-04-01).신성한 전쟁과 Plea 평화고 있습니다.IETF.IEN 137....어떤 비트 먼저 그 단어의 작은 끝에서, 비트는 단어의 큰 끝에 있으면서 해외 여행 가야 하나요?전 접근법의 추종자들은 Little-Endians, 후기의 추종자들은 Big-Endians라 불립니다.또한 IEEE컴퓨터, 10월 1981년 문제에 출판되다.
- ^ Swift, Jonathan (1726). Gulliver's Travels.
- ^ Bryant, Randal E.; David, O'Hallaron (2016), Computer Systems: A Programmer's Perspective (3 ed.), Pearson Education, p. 79, ISBN 978-1-488-67207-1
- ^ "RFC 1314 – A File Format for the Exchange of Images in the Internet". datatracker.ietf.org. Internet Engineering Task Force. April 1992. Retrieved 2021-08-16.
TIFF files start with a file header which specifies the byte order used in the file (i.e., Big or Little Endian)
- ^ Tanenbaum, Andrew S.; Austin, Todd M. (4 August 2012). Structured Computer Organization. Prentice Hall PTR. ISBN 978-0-13-291652-3. Retrieved 18 May 2013.
- ^ "NUXI problem". The Jargon File. Retrieved 2008-12-20.
- ^ Jalics, Paul J.; Heines, Thomas S. (1 December 1983). "Transporting a portable operating system: UNIX to an IBM minicomputer". Communications of the ACM. 26 (12): 1066–1072. doi:10.1145/358476.358504. S2CID 15558835.
- ^ House, David; Faggin, Federico; Feeney, Hal; Gelbach, Ed; Hoff, Ted; Mazor, Stan; Smith, Hank (2006-09-21). "Oral History Panel on the Development and Promotion of the Intel 8008 Microprocessor" (PDF). Computer History Museum. p. b5. Retrieved 23 April 2014.
Mazor: And lastly, the original design for Datapoint ... what they wanted was a [bit] serial machine. And if you think about a serial machine, you have to process all the addresses and data one-bit at a time, and the rational way to do that is: low-bit to high-bit because that’s the way that carry would propagate. So it means that [in] the jump instruction itself, the way the 14-bit address would be put in a serial machine is bit-backwards, as you look at it, because that’s the way you’d want to process it. Well, we were gonna built a byte-parallel machine, not bit-serial and our compromise (in the spirit of the customer and just for him), we put the bytes in backwards. We put the low-byte [first] and then the high-byte. This has since been dubbed “Little Endian” format and it’s sort of contrary to what you’d think would be natural. Well, we did it for Datapoint. As you’ll see, they never did use the [8008] chip and so it was in some sense “a mistake”, but that [Little Endian format] has lived on to the 8080 and 8086 and [is] one of the marks of this family.
- ^ Lunde, Ken (13 January 2009). CJKV Information Processing. O'Reilly Media, Inc. p. 29. ISBN 978-0-596-51447-1. Retrieved 21 May 2013.
- ^ "Cx51 User's Guide: E. Byte Ordering". keil.com.
- ^ Jeff Scheel (2016-06-16). "Little endian and Linux on IBM Power Systems". IBM. Retrieved 2022-03-27.
- ^ Timothy Prickett Morgan (10 June 2019). "The Transition To RHEL 8 Begins On Power Systems". ITJungle. ITJungle. Retrieved 26 March 2022.
- ^ "Differences between BE-32 and BE-8 buses".
- ^ "How to detect New Instruction support in the 4th generation Intel® Core™ processor family" (PDF). Retrieved 2 May 2017.
- ^ Savard, John J. G. (2018) [2005], "Floating-Point Formats", quadibloc, archived from the original on 2018-07-03, retrieved 2018-07-16
- ^ "pack – convert a list into a binary representation".
- ^ "C11 standard". ISO. Section 6.5.2.3 "Structure and Union members", §3 and footnote 95. Retrieved 15 August 2018.
95) If the member used to read the contents of a union object is not the same as the member last used to store a value in the object, the appropriate part of the object representation of the value is reinterpreted as an object representation in the new type as described in 6.2.6 (a process sometimes called “type punning”).
- ^ "3.10 Options That Control Optimization: -fstrict-aliasing". GNU Compiler Collection (GCC). Free Software Foundation. Retrieved 15 August 2018.
- ^ Torvalds, Linus (5 Jun 2018). "[GIT PULL] Device properties framework update for v4.18-rc1". Linux Kernel (Mailing list). Retrieved 15 August 2018.
The fact is, using a union to do type punning is the traditional AND STANDARD way to do type punning in gcc. In fact, it is the *documented* way to do it for gcc, when you are a f*cking moron and use "-fstrict-aliasing" ...
- ^ PDP-11/45 Processor Handbook (PDF). Digital Equipment Corporation. 1973. p. 165.
- ^ AMD64 Architecture Programmer's Manual Volume 2: System Programming (PDF) (Technical report). 2013. p. 80. Archived from the original (PDF) on 2018-02-18.
- ^ Linux 프로그래머 매뉴얼– 라이브러리 기능 –
- ^ Linux 프로그래머 매뉴얼– 라이브러리 기능 –
- ^ "Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z" (PDF). Intel. September 2016. p. 3–112. Retrieved 2017-02-05.
- ^ "ARMv8-A Reference Manual". ARM Holdings.
- ^ "Microsoft Office Excel 97 - 2007 Binary File Format Specification (*.xls 97-2007 format)". Microsoft Corporation. 2007.
- ^ Matt Ahrens (2016). FreeBSD Kernel Internals: An Intensive Code Walkthrough. OpenZFS Documentation/Read Write Lecture.
- ^ Reynolds, J.; Postel, J. (October 1994). "Data Notations". Assigned Numbers. IETF. p. 3. doi:10.17487/RFC1700. STD 2. RFC 1700. Retrieved 2012-03-02.
- ^ 이더넷 POWERLINK 표준화 그룹(2012), EPSG 작업 제안서 301: 이더넷 POWERLINK 통신 프로파일 사양 버전 1.1.4, 6.1.1장.
- ^ IEEE and The Open Group (2018). "3. System Interfaces". The Open Group Base Specifications Issue 7. Vol. 2. p. 1120. Retrieved 2021-04-09.
- ^ "htonl(3) - Linux man page". linux.die.net. Retrieved 2021-04-09.
- ^ Cf. 2.1절 draft-ietf-pppext-sonet-as-00의 비트 전송 "PPP over SONET/SDH 적용성 스테이트먼트"