1. 程式人生 > >大端/小端的存儲模式

大端/小端的存儲模式

() 內容 class void 二進制 表現 永遠 方式 指針

2017年11月23日
大端/小端的存儲模式
1.大端:

  如果是將高字節的數據存儲在低地址低字節數據存儲在高地址,這種存儲模式就是大端模式;
2.小端:

  如果是將高字節的數據存儲在高地址低字節數據存儲在低地址,這種存儲模式就是小端模式;
3.對大小端模式的測試方法:
1).使用union共用體進行測試:

#include <stdio.h>
#include <stdlib.h>
//默認為小端模式;
//使用共用體測試;
union test
{
int a;
char b;
};
void main()
{
union test t1;
char b;
t1.a=1
; b=t1.b; printf("%d\n",b);//輸出結果是1; }

2).使用指針的方式:

#include <stdio.h>
#include <stdlib.h>
//默認為小端模式;
//使用共用體測試;
void main()
{
int a=0;
char b=*((char*)(&a));
printf("%d\n",b);//輸出結果是1;
}

4.看似可行實則不行的測試大小端方式:位與(&)、移位(>>)、強制類型轉化(type)
(1)位與運算。
結論:位與的方式無法測試機器的大小端模式。(表現就是大端機器和小端機器的&運算後的值相同的)


理論分析:位與運算是編譯器提供的運算,這個運算是高於內存層次的(或者說&運算在二進制層次具有可移植性,也就是說&的時候一定是高字節&高字節,低字節&低字節,和二進制存儲無關)。
(2)移位
結論:移位的方式也不能測試機器大小端。
理論分析:原因和&運算符不能測試一樣,因為C語言對運算符的級別是高於二進制層次的。右移運算永遠是將低字節移除,而和二進制存儲時這個低字節在高位還是低位無關的。
(3)強制類型轉換
同上;

5.通信系統中的大小端(數組的大小端)
(1)譬如要通過串口發送一個0x12345678給接收方,但是因為串口本身限制,只能以字節為單位來發送,所以需要發4次;接收方分4次接收,內容分別是:0x12、0x34、0x56、0x78.接收方接收到這4個字節之後需要去重組得到0x12345678(而不是得到0x78563412).

(2)所以在通信雙方需要有一個默契,就是:先發/先接的是高位還是低位?這就是通信中的大小端問題。
(3)一般來說是:先發低字節叫小端;先發高字節就叫大端。實際操作中,在通信協議裏面會去定義大小端,明確告訴你先發的是低字節還是高字節。
(4)在通信協議中,大小端是非常重要的,大家使用別人定義的通信協議還是自己要去定義通信協議,一定都要註意標明通信協議中大小端的問題。

大端/小端的存儲模式