002 大端和小端的區別

2022-05-26 21:39:15 字數 2006 閱讀 1929

一、大小端出現原因

計算機系統是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但對於位數大於8位的處理器,如16位或32位/64位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在乙個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式的出現。

二、為什麼會有小端位元組序?

答案是,計算機電路先處理低位位元組,效率比較高,因為計算都是從低位開始的。所以,計算機的內部處理都是小端位元組序。

但是,人類還是習慣讀寫大端位元組序。所以,除了計算機的內部處理,其他的場合幾乎都是大端位元組序,比如網路傳輸和檔案儲存。

三、計算機硬體有兩種儲存資料的方式:大端位元組序(big endian)和小端位元組序(little endian)。

舉例來說,數值0x2211使用兩個位元組儲存:高位位元組是0x22,低位位元組是0x11

32位整數的求值公式也是一樣的。

/* 大端位元組序 */

i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

/* 小端位元組序 */

i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

四、

同理,0x1234567的大端位元組序和小端位元組序的寫法如下圖

五、對於整型、長整型等資料型別,big endian 認為第乙個位元組是最高位位元組(按照從低位址到高位址的順序存放資料的高位位元組到低位位元組);而 little endian 則相反,它認為第乙個位元組是最低位位元組(按照從低位址到高位址的順序存放據的低位位元組到高位位元組)。

例如,假設從記憶體位址 0x0000 開始有以下資料: 

0x0000         0x0001       0x0002       0x0003 

0x12            0x34           0xab           0xcd

如果我們去讀取乙個位址為 0x0000 的四個位元組變數,若位元組序為big-endian,則讀出結果為0x1234abcd;若位元組序為little-endian,則讀出結果為0xcdab3412。

如果我們將0x1234abcd 寫入到以 0x0000 開始的記憶體中,則little endian 和 big endian 模式的存放結果如下: 

位址           0x0000         0x0001        0x0002          0x0003

big-endian   0x12           0x34            0xab            0xcd 

little-endian  0xcd           0xab            0x34            0x12

一般來說,x86 系列 cpu 都是 little-endian 的位元組序,powerpc 通常是 big-endian,網路位元組順序也是 big-endian還有的cpu 能通過跳線來設定 cpu 工作於 little endian 還是 big endian 模式。

對於0x12345678的儲存:

六、大端小端檢測方法(2015款mac pro跑的如下**)

#include /*return 1: little-endian, return 0: big-endian*/

int checkcpuendian()

c; c.a = 1;

return (c.b == 1);

}using namespace std;

int main()

reference:

01 大端小端

計算機儲存資料是按大端或者小端將資料儲存在記憶體上.一般處理器都只選擇其中的一種,通常intel和amd處理器都是採用小端儲存方式,也有一些處理器是採用大端方式,如果ibm公司的處理器.小端儲存 0x1003 0x78 0x1002 0x56 0x1001 0x34 0x1000 0x12 大端儲存...

(1 1 27)大端和小端問題

所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 網路傳輸是大端儲存模式 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應...

大端和小端儲存區別

計算機中,我們知道是以位元組為單位的,乙個位元組8位,每個位址對應乙個位元組,但是對於大於乙個位元組的資料型別,比如short 2 byte int 4 byte 另外對於 16位,32位的處理器,由於乙個暫存器的寬度大於8,必然存在如何將多個位元組安排問題,因此就有了大端 big endian 和...