伊尼亞語

格列佛(Gulliver)的旅行喬納森·斯威夫特(Jonathan Swift) ,這本小說是從中創造的

計算中, endianness計算機存儲器數據通信中數字數據單詞字節的順序或順序,該字節是通過描述“第一個”字節的影響來識別的,含義是最小的地址或首先發送的。丹尼·科恩( Danny Cohen)在1980年發表的互聯網實驗註釋中,丹尼·科恩(Danny Cohen)在計算機科學中引入了計算機科學介紹的數據訂購的術語,主要表示為大型(BE)或Little -endian (Le)。形容詞Endian的起源於18th的著作。世紀盎格魯 - 愛爾蘭作家喬納森·斯威夫特(Jonathan Swift) 。在1726年的小說《格列佛的旅行》中,他描繪了利利普蒂亞教派之間的衝突,分為那些從大端或小末端打破煮雞蛋的殼的人。

計算機將信息存儲在各種大小的二進制位中。每個組都被分配了計算機用於訪問該數據的數字,稱為其地址。在大多數現代計算機上,具有地址的最小數據組長8位,稱為字節。較大的組包含兩個或多個字節,例如,一個32位單詞包含四個字節。一台計算機可以通過兩種方式將較大組中的單個字節編號,從任一端開始。兩種類型的endianness都在數字電子工程中廣泛使用。最初選擇新設計的尼迪亞人通常是任意的,但是以後的技術修訂和更新會使現有的尼亞斯保持延續以保持向後兼容性

一個大型系統將單詞最重要的字節存儲在最小的內存地址,而最不重要的字節則位於最大的字節上。相比之下,一個小型系統將最不重要的字節存儲在最小的地址。因此,在這兩種情況下,大型數字的數字是用英語從左到右寫的,將數字與字節進行了比較。雙端是一項功能,由許多計算機架構支持,這些計算機體系結構具有可切換的數據獲取和商店中的可切換端,或者用於指令獲取。其他訂單通常稱為中端混合式

Big-endianness是網絡協議中的主要順序,例如在Internet協議套件中,該協議被稱為網絡順序,首先傳輸最重要的字節。相反,Little-Endianness是處理器體系結構( X86 ,大多數ARM實現, RISC-V-V實現)及其相關內存的主要訂購。文件格式可以使用兩種訂購;某些格式使用兩者的混合物或包含在整個文件中使用的訂單的指標。

特徵

表明大與小的圖表

計算機存儲器由一系列存儲單元組成(最小的可尋址單元);在支持字節上的機器中,這些單元稱為字節。通過其內存地址在硬件和軟件中識別並訪問每個字節。如果內存中的字節總數為n ,則將地址從0到n -1列舉。

計算機程序通常使用數據結構或字段,這些數據可能由一個字節中的數據組成。在本文的上下文中,它的類型不能任意複雜,“字段”由連續的字節序列組成,代表了一個“簡單數據值”,至少可能通過一個單個硬件指令來操縱,該序列可以通過該字節來操縱。在大多數係統上,多字節簡單數據值的地址是其第一個字節(地址最低的字節)的地址。該規則的一個例外是,例如, IBM 1401的添加指令,該指令在其低階(最高添加)位置上解決可變長度字段,其長度由在高階(最低標記)上定義的長度定義) 位置。當執行諸如加法之類的操作時,處理器在兩個字段的高地址的低階位置開始,並降低到高階。

字節是“字段”一部分的另一個重要屬性是其“意義”。野外部分的這些屬性在序列中起著重要作用,該字節是由計算機硬件訪問的:更準確地說:通過導致計算機指令結果的低級算法。

數字

位置數字系統(主要是基數2,基礎10)是代表計算機的主要方式,尤其是計算機來操縱整數數據的方式。以純形式,這對於中等大小的非負整數,例如C數據類型有效unsigned。在這樣的數字系統中,其貢獻整個數字的數字不僅取決於其作為單個數字的值,而且還取決於其在完整數字中所擁有的位置,稱為其重要性。這些位置可以以兩種方式映射到內存:

  • 隨著內存地址的增加(或時間增加),數字顯著性降低了,稱為大端
  • 隨著記憶地址的增加(或時間增加),稱為小型 - 數字地址的增加。

在這些表達式中,“終結”一詞是大部分重點的四肢。首先寫的意義很小,即場地開始的位置。

計算機硬件直接支持的整數數據具有低功率的固定寬度為2,例如8位≙1字節,16位≙2字節,32位≙4個字節≙4字節≙4個字節,64位≙8字節≙8字節,128位≙ 16個字節。對此類字段的字節的低級訪問順序取決於要執行的操作。首先訪問最小的字節以進行加法減法乘法。首先訪問最重要的字節進行分區比較。請參閱§計算順序

文字

當角色(文本)字符串彼此比較時,例如為了支持某種機制,例如排序時,這是在單個位置元素(字符)也具有位置值的詞典上經常完成的。詞典比較幾乎意味著到處都是:第一個角色排名最高 - 如電話簿中。幾乎所有可以使用單個指令來執行此操作的機器都是大型或至少混合的機器。

編寫為文本的整數數量總是在內存中首先表示最重要的數字,該數字與大型的數字相似,與文本方向無關。

字節講話

當內存字節從左到右依次打印(例如在十六進制中)時,整數的小末端表示從左到右具有顯著性的增加。換句話說,當可視化時它會向後出現,這可能是違反直覺的。

例如,以四核或類似技術形式出現這種行為,涉及將字符包裝到整數中,從而成為內存中特定字符的序列。例如,以十六進制的ASCII中存儲的字符串“ John”。在Big-Endian機器上,該值出現從左到右,與正確閱讀結果的正確字符串順序相吻合(“ John”)。但是在一台小型機器上,會看到“ nhoj”。中端機器使它更加複雜。例如,在PDP-11上,32位值存儲為兩個16位單詞“ jo”“ hn”中的大型詞,其中16位單詞中的字符存儲在Little-Endian中,結果是在“ ojnh”中。

字節交換

字節交換由重新安排字節組成,以改變底色。許多編譯器提供的內置可能會彙編為本地處理器說明(bswap/movbe), 例如__builtin_bswap32。交換軟件接口包括:

  • 標準網絡末端功能(從/到達,最多32位)。 Windows具有64位擴展winsock2.h.
  • BSD和GLIBCendian.h函數(從/到和le,最高64位)。
  • 蘋果系統OSByteOrder.h宏(從/到be和le,最高64位)。
  • std::byteswapC ++的功能23

一些CPU指令集為Endian字節交換提供了本地支持,例如bswapx86-486以後),以及revARMV6及以後)。

一些編譯器具有用於字節交換的內置設施。例如,英特爾Fortran編譯器支持非標準CONVERT打開文件時的指定符,例如:OPEN(unit, CONVERT='BIG_ENDIAN',...)。其他編譯器具有生成全球代碼的選項,該代碼可以用於所有文件IO操作的轉換。這允許在沒有代碼修改的情況下具有相反的endianness的系統上重複使用代碼。

考慮因素

簡化了對一部分領域的訪問

在大多數係統上,多字節值的地址是其第一個字節(地址最低的字節)的地址;該類型的小型系統具有以下屬性,對於足夠較低的數據值,可以從不同的長度讀取相同的值而不使用不同的地址(即使施加了對齊限制)。例如,具有內容的32位內存位置4A 00 00 00可以在與8位(值= 4A), 16位(004A), 24位(00004A)或32位(000000004A)的地址相同的地址上讀取,所有這些地址都保留了相同的數值。儘管高級程序員很少直接使用這種小型屬性,但偶爾由代碼優化器以及彙編語言程序員使用。雖然C ++不允許使用C11標準的“實現定義”,並且通常在代碼與硬件交互中使用。

計算順序

位置號系統中的某些操作具有自然或首選順序,在該順序中要執行基本步驟。該訂單可能會影響他們在小規模的可調處理器和微控制器上的性能。但是,高性能處理器通常會在相同的時間內從內存中獲取多字節操作數,以獲取單個字節,因此硬件的複雜性不受字節訂購的影響。

加法,減法和乘法從最小的數字位置開始,並將其傳播到隨後的更重要的位置。在大多數係統上,多字節值的地址是其第一個字節(地址最低的字節)的地址。這些操作的實現在使用第一個字節包含最小數字的小型機器上更簡單。

比較和除法從最顯著的數字開始,並將可能的攜帶傳播到隨後的顯著數字較少。對於固定長度的數值(通常為長度為1,2,4,8,16),這些操作的實現在大型計算機上的實現略有簡單。

一些大型處理器(例如IBM System/360及其後繼器)包含用於比較長度角色字符串的硬件說明。

通過分配聲明的正常數據傳輸原則上獨立於處理器的端性。

硬體

許多歷史和現有的處理器都使用大型內存表示形式,無論是專門的還是設計選項。 IBM System/360使用大型字節訂單,其後繼系統/370ESA/390Z/Architecture也是如此。 PDP-10使用大型地址用於字節為導向的說明。 IBM系列/1個微型計算機使用大型字節訂單。摩托羅拉6800 /6801,6809和68000系列的處理器使用大型格式。僅大型架構包括IBM Z/ArchitectureOpenRisc

數據點2200使用了帶有Little-endian的簡單位屬性邏輯來促進攜帶傳播。當英特爾開發了用於數據標記的8008微處理器時,他們使用了Little-Endian來兼容。但是,由於英特爾無法及時交付8008,因此數據點使用了中等規模的集成等效物,但是在大多數英特爾設計中,小時都保留了Little-Endianness,包括MCS-488086及其X86繼任者。 DEC ALPHAATMEL AVRVAXMOS Technology 6502家族(包括Western Design Center 6580265C816 ),Zilog Z80 (包括Z180EZ80 ), Altera Nios II ,以及許多其他處理器和處理器家庭也很少 -恩德尼亞人。

與其他英特爾處理器不同,英特爾8051預計LJMP和LCALL以大型格式提供16位地址。但是,XCALL指令將返回地址存儲在小型格式的堆棧中。

IA-32X86-64指令集體系結構使用小型格式。遵循本慣例的其他指令集架構,僅允許小型模式,包括Nios IIAndes Technology NDS32和Qualcomm Hexagon

某些指令集架構是“雙式”,並且允許運行任何一種endianness的軟件;其中包括Power ISASPARC ,ARM AARCH64 ,C-SKY和RISC-VIBM AIXIBM我以Bi-Endian Power ISA的大型模式運行; Linux最初以大型模式運行,但到2019年,IBM已過渡到LINE-ENDIAN模式,以使Linux將Linux軟件的移植從X86移至Power。 SPARC沒有相關的小型部署,因為Oracle Solaris和Linux在Bi-Endian Sparc系統上都以大端模式運行,並且在實踐中可以被認為是大型的。 ARM,C-SKY和RISC-V沒有相關的大型部署,在實踐中可以被認為是小的。

雙方

某些指令集具有一個設置,該設置允許在數據獲取和商店,指令獲取或兩者中可切換的端度。此功能可以提高性能或簡化網絡設備和軟件的邏輯。說到硬件時,雙末日一詞表示機器以任何一種endian格式計算或傳遞數據的能力。

某些體系結構(包括ARM版本3及以上, PowerPCAlphaSparc V9, MIPSIntel I860PA-RISCSUPER SH-4IA-64 )具有設置,可以在數據獲取和商店中可切換式Endians,指令,指令,指令提取,或兩者兼而有之。此功能可以提高性能或簡化網絡設備和軟件的邏輯。說到硬件時,雙末日一詞表示機器以任何一種endian格式計算或傳遞數據的能力。

這些架構中的許多可以通過軟件切換到默認為特定的endian格式(通常在計算機啟動時完成);但是,在某些系統上,主板上的硬件選擇了默認的endianness,並且無法通過軟件更改(例如,Alpha,僅在Cray T3E上以大型模式運行)。

Bi-endian一詞主要是指處理器如何處理數據訪問。在給定處理器上的指令訪問(指令詞)仍然可以假定固定的endianness,即使數據訪問完全是雙方的,儘管情況並非總是如此,例如在Intel的IA-64基於ITAN的ITANIUM CPU上,它允許兩者兼而有之。

一些名義上的雙式CPU需要主板幫助才能完全切換Endianges。例如,從執行程序的角度來看,以Lieth-endian模式為Little-Endian的32位台式電源PowerPC處理器作為Little-endian,但他們要求主板在所有8個字節道上執行64位交換到確保對事物的小型觀點適用於I/O設備。在沒有這種不尋常的主板硬件的情況下,設備驅動程序軟件必須寫入不同的地址才能撤消不完整的轉換,還必須執行正常的字節交換。

某些CPU,例如許多用於嵌入式使用的PowerPC處理器,幾乎所有SPARC處理器都可以選擇Endianness。

自1990年代後期以來,SPARC處理器(SPARC V9處理器)允許選擇數據ENDIANNESS與每種單獨的指令一起從加載或存儲到內存的單個指令。

ARM架構支持兩種大型模式,稱為BE-8BE-32 。 CPU到ARMV5僅支持BE-32或單詞不變模式。在這裡,任何自然對齊的32位訪問都在小型模式下工作,但是將對字節或16位單詞的訪問重定向到相應的地址,並且不允許使用未對齊的訪問。 ARMV6介紹BE-8或字節不變模式,其中訪問單個字節在LITLE-ENDIAN模式下工作,但訪問16位,32位或(從ARMV8開始)64位單詞在字節交換中結果數據。這簡化了未對齊的內存訪問以及對32位以外的寄存器的內存映射訪問。

許多處理器都有指示將寄存器中的單詞轉換為相反的endianness,也就是說,它們以16、32或64位單詞交換字節的順序。

最近的Intel X86和X86-64體系結構CPU具有MOVBE指令(自原子之後的Intel Core以來,Intel Core),該指令從內存中獲取了一個大型格式的單詞或以大型形式寫入內存。這些處理器否則是徹底的小型。

還有一些設備在不同地方使用不同格式。例如,BQ27421 Texas Instruments電池儀使用其寄存器的小型格式和大型格式的隨機記憶

SPARC歷史上使用了Big-Endian,直到Bi-Endian版本9版。同樣,早期的IBM電源加工機是大型的,但是PowerPCPower ISA的後代現在是雙方。 Arm建築成為Bi-Endian之前的第3版之前的小型建築。

浮點

儘管許多處理器都使用Ligh-Endian存儲來用於所有類型的數據(整數,浮點),但有許多硬件體系結構以大型形式表示浮點數,而整數則以小型形式表示。有些ARM處理器具有雙重精度數字的混合式浮點表示:兩個32位單詞中的每個單詞都存儲為小末端,但最重要的單詞首先存儲。 Vax Floating Point以大型秩序存儲Little-Endian 16位單詞。由於沒有許多沒有網絡標準表示的浮點格式,因此XDR標準使用Big-Endian IEEE 754作為其表示形式。因此,顯得奇怪的是,普遍的IEEE 754浮點標準未指定端度。從理論上講,這意味著即使是一台機器編寫的標準IEEE浮點數據也可能無法由另一台計算機讀取。但是,在現代標準計算機(即實施IEEE 754)上,可以肯定地假設浮點數與整數相同,而無論數據類型如何,轉換都可以直接轉換。但是,使用特殊浮點格式的小型嵌入式系統可能是另一回事。

可變長度數據

到目前為止,大多數指令都包含操作代碼中其操作數的大小(長度)。經常可用的操作數長度為1、2、4、8或16個字節。但是,在某些體系結構中,操作數的長度可以在指令的單獨字段或操作數本身中保存,例如通過單詞標記。這樣的方法允許操作數長度高達256個字節或更大。此類操作數的數據類型是字符串BCD 。能夠用一項指令操縱此類數據的機器(例如,比較,添加)包括IBM 1401、1410、1620 System/360 System/370ESA/390Z/Architecture ,所有這些都是Big-Endian類型。

中端

許多其他訂單(通常稱為中端混合式)是可能的。

PDP-11體系結構在其本機16位單詞中很小,但是將32位數據存儲為不尋常的大型單詞對。 Unix是最早允許與具有不同內部表示形式的平台編譯相同代碼的系統之一。第一個轉換的程序之一應該打印出來Unix,但在系列/1上打印nUxi反而。

PDP-11原則上是一個16位小型系統。在PDP-11/45,PDP-11/70的可選浮點處理器中轉換浮點和整數值的說明,以及在某些後來的處理器中,存儲了32位“雙精度整數長”值,帶有帶有從預期的小秩序中換了16位的一半。 UNIX C編譯器使用相同的格式用於32位長整數。此順序稱為PDP-Endian

一種解釋這種底色的方法是,它將32位整數存儲為兩個小的16位單詞,並帶有一個大型單詞訂購。

IA-32和兼容處理器的段描述符保持了以小階順序存儲的片段的32位基礎地址,但在四個非連續字節中,在描述符開始的相對位置2、3、4和7處。

軟體

邏輯設計

用來表達數字邏輯的硬件說明語言(HDL)通常以任意粒度支持任意的尼語。例如,在SystemVerilog中,可以將一個單詞定義為Little-endian或Big-Endian。

文件和文件系統

當讀取在具有不同endianness的計算機上創建的文件或文件系統時,對endianness的識別很重要。

fortran順序未格式的未格式化的文件通常無法使用另一個端性在系統上讀取系統,因為Fortran通常將記錄(定義為單個fortran語句編寫的數據定義為單個fortran語句編寫的數據),為數據先於計數字段,而整數是整數等於數據中的字節數。嘗試使用Fortran在另一個Endianness系統上讀取此類文件會導致運行時錯誤,因為計數字段不正確。

Unicode文本可以選擇以字節訂單標記(BOM)開頭,以發出文件或流的末日性。它的代碼點是u+feff。例如,在UTF-32中,一個大型文件應以00 00 FE FF;一個小的開始應該從FF FE 00 00.

應用程序二進制數據格式(例如MATLAB .mat文件或地形中使用的.BIL數據格式)通常是無關的。這是通過將數據始終存儲在一個固定的denianness中或攜帶數據開關來指示dendians來實現的。前者的一個示例是二進制XLS文件格式,該格式在Windows和Mac Systems之間可移植,並且始終是Little-endian,需要Mac應用程序在加載時交換字節並在大型Motorola 68K或PowerPC處理器上運行時進行保存。

TIFF映像文件是第二個策略的一個示例,其標題指示其內部二進制整數的末日性的應用程序。如果文件以簽名開頭MM這意味著整數被表示為大型,而II意思是小東方。這些簽名每個都需要一個16位單詞,它們是alindromes ,因此它們是獨立的。I代表英特爾M代表摩托羅拉。 Intel CPU是小的,而Motorola 680x0 CPU是大型的。此明確的簽名允許TIFF讀取器程序在必要時交換字節時,當由TIFF Writer程序生成具有不同endianness的計算機上的TIFF Writer程序時。

由於其在英特爾8080平台上的原始實現,獨立於操作系統的文件分配表(FAT)文件系統也是通過Little-Endian Byte訂購來定義的,即使在本地使用另一個末日的平台上,也必須使用Byte -S-Swap操作來維護這些平台上的脂肪。

ZFS結合了文件系統邏輯卷經理,已知可以提供自適應的底色,並可以與大型和小型系統一起使用。

聯網

許多IETF RFC使用術語網絡順序,這意味著網絡協議電線上字節的傳輸順序。除其他外,歷史悠久RFC 1700Internet協議套件中協議的網絡順序定義為大型。

但是,並非所有協議都使用Big-Endian字節訂單作為網絡順序。服務器消息塊(SMB)協議使用Little-Endian字節順序。在CANOPEN中,多字節參數始終是最不重要的字節(Little-endian)。以太網PowerLink也是如此。

Berkeley插座API定義了一組功能,可以將16和32位整數轉換為網絡字節順序:htons(主機到網絡簡稱)和htonl(主機到網絡長)函數分別將16和32位值從機器(主機)轉換為網絡順序;這ntohsntohl功能從網絡轉換為主機訂單。這些功能可能是大型系統上的無效

雖然高級網絡協議通常將字節(主要是八位字)視為其原子單元,但網絡堆棧的最低層可能處理字節內的位訂單。

也可以看看