1. 原因
這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit。但是在C語(yǔ)言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對(duì)于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著一個(gè)如何將多個(gè)字節(jié)安排的問(wèn)題。因此就導(dǎo)致了大端存儲(chǔ)模式和小端存儲(chǔ)模式。
??例如一個(gè)16bit的short型x,在內(nèi)存中的地址為0x0010,x的值為0x1122,那么0x11為高字節(jié),0x22為低字節(jié)。對(duì)于大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結(jié)構(gòu)是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來(lái)選擇是大端模式還是小端模式。
2.那什么是大端和小端
? Little-Endian:低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。示例數(shù)字0x12 34 56 78在內(nèi)存中的表示形式:
??內(nèi)存 低地址 -----------------> 高地址
??0x78 | 0x56 | 0x34 | 0x12 *
??低位子節(jié) -----------------> 高位子節(jié)*
? Big-Endian:高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。示例數(shù)字0x12 34 56 78在內(nèi)存中的表示形式:
??內(nèi)存 低地址 -----------------> 高地址
???? 0x12 | 0x34 | 0x56 | 0x78
??高位子節(jié) -----------------> 低位子節(jié)
可見(jiàn),大端模式和字符串的存儲(chǔ)模式類似。但是也有各自的特點(diǎn):
? 小端模式 :強(qiáng)制轉(zhuǎn)換數(shù)據(jù)不需要調(diào)整字節(jié)內(nèi)容,1、2、4字節(jié)的存儲(chǔ)方式一樣。
? 大端模式 :符號(hào)位的判定固定為第一個(gè)字節(jié),容易判斷正負(fù)。
3.轉(zhuǎn)換一致性

根據(jù)上圖可以得知只有經(jīng)過(guò)轉(zhuǎn)換的數(shù)據(jù)才能保持大小端數(shù)據(jù)的一致性。
4. 轉(zhuǎn)化詳情介紹

注釋:
對(duì)于大小端的幾個(gè)結(jié)論:
1.char型變量和char型數(shù)組沒(méi)有大小端的區(qū)分。
2.需要轉(zhuǎn)化數(shù)據(jù)類型大于1個(gè)字節(jié)的數(shù)據(jù)類型:short,int,枚舉,聯(lián)合體等。
4.1 為什么要進(jìn)行大小端轉(zhuǎn)化?
簡(jiǎn)單說(shuō)一下為什么要進(jìn)行大小端轉(zhuǎn)化:目前我接觸到的,arm是小端,dsp是大端,電腦是小段,網(wǎng)絡(luò)數(shù)據(jù)一般為大端,當(dāng)arm需要和dsp通信的時(shí)候就會(huì)存在大小端轉(zhuǎn)化的問(wèn)題,每種芯片為什么選用大小端的由來(lái)就不贅述了。
4.2、字節(jié)間的大小端轉(zhuǎn)化:
1,舉例說(shuō)明字節(jié)間的大小端:
內(nèi)存中有如下一段數(shù)據(jù)(unsigned int 型),不同的大小端對(duì)這個(gè)段數(shù)據(jù)的理解不同,所以在我們實(shí)際工作中,當(dāng)你查看到內(nèi)存中的數(shù)據(jù)時(shí)候,首先要清楚這個(gè)處理器的大小端,才能理解這段數(shù)實(shí)際代表的值。

如果是大端處理器:這段數(shù)代表:0x12345678;
如果是小段處理器:這段數(shù)代表:0x78563412 ;
內(nèi)存中有如下一段數(shù)據(jù)(unsigned short 型):

如果是大端處理器:這段數(shù)代表的值:0x1234;
如果是小段處理器:這段數(shù)代表的值:0x3412 ;
在兩個(gè)不同大小端的處理器之間數(shù)據(jù)傳輸,數(shù)據(jù)再內(nèi)存的存放順序并沒(méi)有變,不同大小端需要解讀出通用的值,就需要進(jìn)行大小端轉(zhuǎn)化。
4.3、在小端處理器下看內(nèi)存

4.3、在小端處理器下看內(nèi)存
小端數(shù)據(jù)為:0x E4BDB9D7, 現(xiàn)將數(shù)據(jù)進(jìn)行翻轉(zhuǎn)看,然后從底地址數(shù)據(jù)開始讀:

可以看出小端是從底地址的字節(jié)的底bit位開始分配。
4.4、在大端處理器下看內(nèi)存

