little endian c语言,c语言那些细节之little-endian和big-endian
知道大小端,但是都沒有整理下,只知道網絡要用到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
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
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;
}
總結
以上是生活随笔為你收集整理的little endian c语言,c语言那些细节之little-endian和big-endian的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 低压电气知识大全
- 下一篇: [SQL]将子查询作为查询条件