知道大小端,但是都沒有整理下,只知道網路要用到big-endian,也就是大端模式。
在各種電腦體繫結構中,對於位元組、字等的儲存機制有所不同,因而引發了電腦通訊領域中一個很重要的問題,即通訊雙方交流的資訊單元(位元、位元組、字、雙字等等)應該以什麼樣的順序進行傳送。如果不達成一致的規則,通訊雙方將無法進行正確的編/解碼從而導致通訊失敗。目前在各種體系的電腦中通常採用的位元組儲存機制主要有兩種:Big-Endian和Little-Endian。
以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其儲存情況,我們可以用unsigned char buf[4]來表示value:
Big-Endian: 低地址存放高位,如:
棧底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
棧頂 (低地址)
Little-Endian: 低地址存放低位,如:
棧底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
棧頂 (低地址)
Big-Endian 優點: 靠首先提取高位位元組,你總是可以由看看在位移位置為0的位元組來確定這個數字是正數還是負數。你不必知道這個數值有多長,或者你也不必過一些位元組來看這個數值是否含有符號位。這個數值是以它們被列印出來的順序存放的,所以從二進位到十進位的函數特別有效。因而,對於不同要求的機器,在設計存取方式時就會不同。
Little-Endian 優點: 提取一個,兩個,四個或者更長位元組資料的彙編指令以與其他所有格式相同的方式進行:首先在位移地址為0的地方提取最低位的位元組,因為地址位移和位元組數是一對一的關係,多重精度的數學函數就相對地容易寫了。
如何檢查處理器是 Big-Endian 還是 Little-Endian?
由於聯合體union的存放順序是所有成員都從低地址開始存放,利用該特性就可以輕鬆地獲得了CPU對記憶體採用Little-endian還是Big-endian模式讀寫。例如:
#include <stdio.h>int checkCPUendian(){ union { unsigned int a; unsigned char b; }c; c.a = 1; return (c.b == 1); } /*return 1 : little-endian, return 0:big-endian*/int main(){ checkCPUendian() ? printf("Little-endian\n"):printf("Big-endian\n"); return 0;}
或者最直接的:
#include <stdio.h>int main(){ short int x; char x0,x1; x = 0x1122; x0 = ((char*)&x)[0]; //低地址單元 x1 = ((char*)&x)[1]; //高地址單元 if(x0 == 0x11) printf("Big-endian\n"); else printf("Little-endian\n"); return 0;}