大小端轉(zhuǎn)換的原因

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)換一致性

image.png

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

4. 轉(zhuǎn)化詳情介紹

image.png

注釋:
對(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í)際代表的值。


image.png

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

image.png

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

4.3、在小端處理器下看內(nèi)存

image.png

4.3、在小端處理器下看內(nèi)存

小端數(shù)據(jù)為:0x E4BDB9D7, 現(xiàn)將數(shù)據(jù)進(jìn)行翻轉(zhuǎn)看,然后從底地址數(shù)據(jù)開始讀:


image.png

可以看出小端是從底地址的字節(jié)的底bit位開始分配。

4.4、在大端處理器下看內(nèi)存

image.png

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.什么是大小端? 這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為 8bi...
    MachinePlay閱讀 10,945評(píng)論 0 4
  • 本文包括2部分內(nèi)容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endi...
    半島夏天閱讀 2,599評(píng)論 0 1
  • ??這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit。但是在C語(yǔ)言中...
    starmier閱讀 7,229評(píng)論 1 3
  • 大小端介紹問(wèn)題總結(jié) 一、簡(jiǎn)介大小端定義 大端模式所謂的大端模式,是指數(shù)據(jù)的低位(就是權(quán)值較小的后面那幾位)保存在內(nèi)...
    遇銀閱讀 1,475評(píng)論 3 1
  • 一、什么是大小端? 表示數(shù)據(jù)在存儲(chǔ)器中的存放順序小端模式:數(shù)據(jù)的高字節(jié),存放在高地址中。計(jì)算機(jī)讀取數(shù)據(jù)的方向,是從...
    lockezhang78閱讀 10,603評(píng)論 3 2

友情鏈接更多精彩內(nèi)容