您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
數(shù)據(jù)在存放到內(nèi)存里的時(shí)候,有兩種存放方式,即:Big Endian(大端模式) 和 Little Endian(小端模式)
這兩個(gè)存取方式?jīng)Q定了內(nèi)存存放數(shù)據(jù)的原則是 高高低低 原則 還是 高低低高 原則。
高高低低--內(nèi)存中的高位存放數(shù)據(jù)的高位,內(nèi)存中的低位存放數(shù)據(jù)的低位(Little Endian )
高低低高--內(nèi)存中的高位存放數(shù)據(jù)的低位,內(nèi)存中的低位存放數(shù)據(jù)的高位(Big Endian )
比如:我有一個(gè)數(shù)據(jù),是0xA5A1,它在存放到內(nèi)存中是怎樣存放的呢?因?yàn)樵谖覀兤綍r(shí)的書寫中,A5是高位,A1在低位,存放到內(nèi)存中的時(shí)候,A1存放在0x4000這個(gè)位置,而A5存放在0x4001這個(gè)位置,高位存放在內(nèi)存的高地址中,低位存放在低地址中,這種方式就是Little Endian 。
下面再粘一篇網(wǎng)友的總結(jié)的文章來詳細(xì)闡述一下這兩種方式的區(qū)別:
Big Endian 和 Little Endian 模式的區(qū)別(轉(zhuǎn)載)
談到字節(jié)序的問題,必然牽涉到兩大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存儲(chǔ)數(shù)據(jù),而x86系列則采用little endian方式存儲(chǔ)數(shù)據(jù)。那么究竟什么是big endian,什么又是little endian呢?
其實(shí)big endian是指低地址存放最高有效字節(jié)(MSB),而little endian則是低地址存放最低有效字節(jié)(LSB)。
用文字說明可能比較抽象,下面用圖像加以說明。比如數(shù)字0x12345678在兩種不同字節(jié)序CPU中的存儲(chǔ)順序如下所示:
Big Endian
低地址 高地址
----------------------------------------------------------------------------->
| 12 | 34 | 56 | 78 |
Little Endian
低地址 高地址
----------------------------------------------------------------------------->
| 78 | 56 | 34 | 12 |
從上面兩圖可以看出,采用big endian方式存儲(chǔ)數(shù)據(jù)是符合我們?nèi)祟惖乃季S習(xí)慣的。
為什么要注意字節(jié)序的問題呢?你可能這么問。當(dāng)然,如果你寫的程序只在單機(jī)環(huán)境下面運(yùn)行,并且不和別人的程序打交道,那么你完全可以忽略字節(jié)序的存在。但是,如果你的程序要跟別人的程序產(chǎn)生交互呢?尤其是當(dāng)你把你在微機(jī)上運(yùn)算的結(jié)果運(yùn)用到計(jì)算機(jī)群上去的話。
在這里我想說說兩種語言。C/C++語言編寫的程序里數(shù)據(jù)存儲(chǔ)順序是跟編譯平臺(tái)所在的CPU相關(guān)的,而JAVA編寫的程序則唯一采用big endian方式來存儲(chǔ)數(shù)據(jù)。試想,如果你用C/C++語言在x86平臺(tái)下編寫的程序跟別人的JAVA程序互通時(shí)會(huì)產(chǎn)生什么結(jié)果?就拿上面的0x12345678來說,你的程序傳遞給別人的一個(gè)數(shù)據(jù),將指向0x12345678的指針傳給了JAVA程序,由于JAVA采取big endian方式存儲(chǔ)數(shù)據(jù),很自然的它會(huì)將你的數(shù)據(jù)翻譯為0x78563412。因此,在你的C程序傳給JAVA程序之前有必要進(jìn)行字節(jié)序的轉(zhuǎn)換工作。
所有網(wǎng)絡(luò)協(xié)議也都是采用big endian的方式來傳輸數(shù)據(jù)的。所以有時(shí)我們也會(huì)把big endian方式稱之為網(wǎng)絡(luò)字節(jié)序。當(dāng)兩臺(tái)采用不同字節(jié)序的主機(jī)通信時(shí),在發(fā)送數(shù)據(jù)之前都必須經(jīng)過字節(jié)序的轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)序后再進(jìn)行傳輸。ANSI C中提供了下面四個(gè)轉(zhuǎn)換字節(jié)序的宏。
一道C語言的試題:請(qǐng)寫一個(gè)C函數(shù),若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1。
解答:
int checkCPU()
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
}
嵌入式系統(tǒng)開發(fā)者應(yīng)該對(duì)Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU對(duì)操作數(shù)的存放方式是從低字節(jié)到高字節(jié),而Big-endian模式對(duì)操作數(shù)的存放方式是從高字節(jié)到低字節(jié)。例如,16bit寬的數(shù)0x1234在Little- endian模式CPU內(nèi)存中的存放方式(假設(shè)從地址0x4000開始存放)為:
內(nèi)存地址 |
存放內(nèi)容 |
0x4000 |
0x34 |
0x4001 |
0x12 |
而在Big-endian模式CPU內(nèi)存中的存放方式則為:
內(nèi)存地址 |
存放內(nèi)容 |
0x4000 |
0x12 |
0x4001 |
0x34 |
32bit寬的數(shù)0x12345678在Little-endian模式CPU內(nèi)存中的存放方式(假設(shè)從地址0x4000開始存放)為:
內(nèi)存地址 |
存放內(nèi)容 |
0x4000 |
0x78 |
0x4001 |
0x56 |
0x4002 |
0x34 |
0x4003 |
0x12 |
而在Big-endian模式CPU內(nèi)存中的存放方式則為:
內(nèi)存地址 |
存放內(nèi)容 |
0x4000 |
0x12 |
0x4001 |
0x34 |
0x4002 |
0x56 |
0x4003 |
0x78 |
聯(lián)合體union的存放順序是所有成員都從低地址開始存放,解答利用該特性,輕松地獲得了CPU對(duì)內(nèi)存采用Little-endian還是Big-endian模式讀寫。
低位字節(jié)存放低位還是高位,如果是低位,則為小段,如果為高位,則為大端,人一般從從左向右讀,所以低位存放著高位數(shù)據(jù),一般很適合大端很適合人們的閱讀。
上一篇:說說M451的例程庫的說明
下一篇:C語言——內(nèi)存分配
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08