002_大端和小端的區別
一、大小端出現原因
計算機系統是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為8bit。但對於位數大於8位的處理器,如16位或32位/64位的處理器,由於暫存器寬度大於一個位元組,那麼必然存在一個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式的出現。
二、為什麼會有小端位元組序?
答案是,計算機電路先處理低位位元組,效率比較高,因為計算都是從低位開始的。所以,計算機的內部處理都是小端位元組序。
但是,人類還是習慣讀寫大端位元組序。所以,除了計算機的內部處理,其他的場合幾乎都是大端位元組序,比如網路傳輸和檔案儲存。
三、
計算機硬體有兩種儲存資料的方式:大端位元組序(big endian)和小端位元組序(little endian)。
舉例來說,數值0x2211
使用兩個位元組儲存:高位位元組是0x22
,低位位元組是0x11
。
- 大端位元組序:高位位元組在前,低位位元組在後,這是人類讀寫數值的方法。
- 小端位元組序:低位位元組在前,高位位元組在後,即以
0x1122
形式儲存。
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 0x00010x00020x0003
0x12 0x34 0xab 0xcd
如果我們去讀取一個地址為 0x0000 的四個位元組變數,若位元組序為big-endian,則讀出結果為0x1234abcd;若位元組序為little-endian,則讀出結果為0xcdab3412。
如果我們將0x1234abcd 寫入到以 0x0000 開始的記憶體中,則Little endian 和 Big endian 模式的存放結果如下:
地址 0x0000 0x00010x0002 0x0003
big-endian0x12 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的儲存:
小端模式:(從低位元組到高位元組)
地位地址 0x78 0x56 0x34 0x12 高位地址
大端模式:(從高位元組到低位元組)
地位地址 0x12 0x34 0x56 0x78 高位地址
六、大端小端檢測方法(2015款MAC pro跑的如下程式碼)
#include <iostream> /*return 1: little-endian, return 0: big-endian*/ int checkCPUendian() { union { unsigned int a; unsigned char b; }c; c.a = 1; return (c.b == 1); } using namespace std; int main() { //---------------------- (1)第一種查詢方式 ----------------------// cout<<checkCPUendian()<<endl;//輸出=> 1,表示小端(Intelx86處理器) //---------------------- (2)第二種查詢方式 ----------------------// int i = 1; char *p = (char *)&i; if(*p == 1) printf("Little Endian");//輸出=> Little Endian,表示小端(Intelx86處理器) else printf("Big Endian"); return 0; }
Reference:
https://www.ruanyifeng.com/blog/2016/11/byte-order.html
https://www.cnblogs.com/luxiaoxun/archive/2012/09/05/2671697.html