商務(wù)網(wǎng)站建設(shè)綜合實(shí)訓(xùn)信陽(yáng)網(wǎng)絡(luò)推廣公司
1. 大小端介紹
-
大端(Big Endian)和小端(Little Endian)是兩種CPU或者計(jì)算機(jī)系統(tǒng)存儲(chǔ)數(shù)據(jù)的方式。
-
在大端系統(tǒng)中,數(shù)據(jù)的高位字節(jié)(MSB)存儲(chǔ)在內(nèi)存地址的低位,低位字節(jié)(LSB)存儲(chǔ)在內(nèi)存地址的高位,這種存儲(chǔ)方式類(lèi)似于閱讀習(xí)慣,從左到右。
-
在小端系統(tǒng)中,數(shù)據(jù)的低位字節(jié)存儲(chǔ)在內(nèi)存地址的低位,高位字節(jié)存儲(chǔ)在內(nèi)存地址的高位,這種存儲(chǔ)方式和我們平時(shí)閱讀數(shù)字的順序是一致的,從右到左。假如我們有一個(gè)十六進(jìn)制數(shù)
0x12345678
占用四個(gè)字節(jié),如果它是大端存儲(chǔ)將是以下畫(huà)面:
因?yàn)?code>12是十六進(jìn)制數(shù)
0x12345678
的高位,它存在低地址位中,因此是高位字節(jié)存儲(chǔ)在低內(nèi)存地址,因此是大端存儲(chǔ),這也看起來(lái)符合人的思維
如果它小端存儲(chǔ)則是以下畫(huà)面
這看起來(lái)就很反人類(lèi)阿,低字節(jié)的
78
存在了左邊,但是字面上卻合順,即低字節(jié)存在地址低字節(jié)。這就是小端存儲(chǔ)。
2. 使用union判斷大小端
2.1 union內(nèi)存處理方式
union內(nèi)存特點(diǎn)主要有如下:
- 聯(lián)合體的所有成員相對(duì)于基地址的偏移量為0
- 聯(lián)合的內(nèi)存大小等于其中最大成員的大小。
- 聯(lián)合的所有成員共享同一塊內(nèi)存區(qū)域,即它們的存儲(chǔ)位置是相同的。
- 其對(duì)其方式要適合于聯(lián)合體中所有類(lèi)型的成員
用人話講就是:
- 聯(lián)合體要大于等于最長(zhǎng)的一個(gè)結(jié)構(gòu)變量的空間
- 聯(lián)合體變量的各個(gè)成員都是從低字節(jié)開(kāi)始公用的(這是最重要的)
2.2 使用union判斷大小端
#include <stdio.h>int check_ending()
{union{int a;char b;}c;c.a = 1;return c.b == 1;
}int main()
{if (check_ending()) printf("the little end!");else printf(" the big end");
}
代碼中使用了一個(gè)聯(lián)合體c來(lái)測(cè)試CPU字節(jié)序。聯(lián)合體中包含了一個(gè)int類(lèi)型的成員a和一個(gè)char類(lèi)型的成員b。因?yàn)閕nt類(lèi)型占據(jù)了4個(gè)字節(jié),而char類(lèi)型只占據(jù)了一個(gè)字節(jié),所以當(dāng)聯(lián)合體中的整型變量a被設(shè)置為1時(shí),如果該CPU是小端序,它在內(nèi)存中的存儲(chǔ)順序?qū)?huì)是0x01 00 00 00,而char類(lèi)型變量b所占據(jù)的第一個(gè)字節(jié)的值應(yīng)該為1。如果是大端序,它在內(nèi)存中的存儲(chǔ)順序?qū)?huì)是0x00 00 00 01,而char類(lèi)型變量b所占據(jù)的第一個(gè)字節(jié)的值應(yīng)該為0。
最后,在main函數(shù)中根據(jù)checkCPU()的返回值輸出對(duì)應(yīng)的信息,告知當(dāng)前CPU的字節(jié)序。如果checkCPU()返回true,則表示當(dāng)前CPU是小端序,輸出"The endian of cpu is little \n";如果checkCPU()返回false,則表示當(dāng)前CPU是大端序,輸出"The endian of cpu is big \n"。
畫(huà)圖講解:
c+-------+
a | | 0x00000001+-------+
b | 01 | 0x01+-------+小端序:
c.a = 0x00000001,在內(nèi)存中的存儲(chǔ)順序?yàn)?#xff1a;
+----+----+----+----+
| 01 | 00 | 00 | 00 |
+----+----+----+----+
c.b 的值為0x01,低地址存放低字節(jié),因此判斷為小端序,由于b也是從低字節(jié)開(kāi)始存儲(chǔ)數(shù)據(jù),因此b的數(shù)值和a一樣。大端序:
c.a = 0x00000001,在內(nèi)存中的存儲(chǔ)順序?yàn)?#xff1a;
+----+----+----+----+
| 00 | 00 | 00 | 01 |
+----+----+----+----+
c.b 的值為0x00,低地址存放高字節(jié),因此判斷為大端序,a的低字節(jié)位1存在了內(nèi)存的高地址上,b卻仍然從低地址位讀數(shù)據(jù),因此是0