1. 爲何會產生兩種模式:
在計算機中咱們是以字節爲單位的,每個地址單元都對應着一個字節,一個字節就是8位,c語言中char類型以外,還
有四個字節的int,個字節的longlong類型,而且除了對於超過8位的處理器,好比32位處理器,64位處理器,因爲寄存器的寬
度、大於一個字節就必然存在着字節安排的問題,所以就出現了大端模式和小端模式網絡
2.兩種模式的定義:
在計算機的結構體系中,對於字節,字等的存儲機制有所不一樣,,目前在各個體系的計算機中一般採用的字節存儲機制
主要有兩種:大端模式和小端模式,大端模式:就是將高位的數據(權重較高的數據)存放在地址上,小端模式:就是
將低位的數據(權重較低的數據)存放在低位的地址上,採用大端模式存取數據比較符合人的思惟,可是採用小端模式
存放數據更有利於計算機處理,因此到目前爲止,誰好誰壞尚未定論。
例子:測試
若是定義一個整型(int)的變量:int a=0x12345678,這個整型變量在內存中的存儲在大小端的不一樣的模式下存儲狀況
大端模式的存儲由下圖所示:spa
小端模式的存儲以下圖所示:操作系統
注意:這裏說明一點,存儲是以字節爲單位的,因此一個字節內的數據是不用遵循大端模式和小端模式的,就像小端模式中是0x78,而3d
不是0X87
3.大端和小端的應用:
談到字節排序問題就一定會牽扯到兩大cpu的派系,那就是motorola的powerPC系列的CPU和intel的X86系列,powerPC系列
的CPU採用的是大端模式,intel的X86系列採用的是小端模式
大端模式:網絡,大多通訊協議是大端的,powerPC,IBM,Sun
小端模式:主機,通常操做系統是小端的,X86,DEC
ARM既能夠工做在大端模式也能夠工做在小端模式
4. 測試本地設備採用的是大端模式仍是小端模式:指針
第一種方法:定義一個大於一個字節的數據類型的變量假設爲變量爲a,用小於變量a的數據類型的指針進行強制轉化
將變量地址進行截斷,而後再用*間接訪問該地址中所存的數據,看看是高位數據仍是低位數據,就能夠得出結果了,
代碼以下圖所示:code
#include <stdio.h> bool isbigendian () { int a=0x12345678; char b=(*(char*)&a); if (b=0x1) { return true; } return false; } int main () { if(isbigendian ()) { printf ("該設備下是大端模式\n"); } else { printf ("該設備下是小端模式\n"); } return 0; }
第二種方法:運用聯合體的特性:聯合體union在任何同一時刻聯合體都只存放一個被選中的成員,而且全部全部成員都是
從低地址開始存放,;利用這一特性,咱們能夠定義一個聯合體,先定義一個字節數大於1變量例如int a;在定義一個字
節數小於變量a的變量,而後將變量a進行賦值,而後訪問變量b,若是是高位上的數字就是大端模式,若是是低位上的數
字就是小端模式,代碼以下圖所示:blog
#include <stdio.h> bool isbigendian1 () { union sun { short a; char b; }sun; sun.a=0x1234; if (sun.b=0x12) { return true; } else { return false ; } } int main () { if (isbigendian1 ()) { printf ("該設備是使用的是大端模式\n"); } else { printf ("該設備使用的是小端模式\n"); } return 0; }
5.通訊:
網絡上傳輸數據廣泛採用的是大端模式,powerPC處理器主導網絡市場,能夠絕大多數的通訊設備都使用的是powerPC處
理器這也可能就是網絡上絕大多數的協議採用的是大端模式的緣由,所以,在使用小端模式處理器須要使用網絡通訊時
須要在軟件中處理端模式的轉變排序