大小端模式詳解

2021-09-28 20:26:58 字數 1559 閱讀 7169

1.問題引入

加3g實驗室的艱難之旅,遇到一道這樣的實驗室面試題:

閱讀以下**,計算結果

int main();

int *ptr2 = (int *)((long int)a+1);

printf("%x",*ptr2);

return 0; }

** 輸出結果為

2000000

**原題對

a強制轉換為

int,

64位機指標長度為八個位元組,所以改為

long int。

先來分析一下表示式,

a為陣列

a[0]

的位址,強制轉換為長整型變為位址的數值後加一,實際為第乙個元素的第二位元組位址的數值。後轉換為一指向整型的指標並賦值給

ptr2

。整型為

4個位元組,從第一元素第二位元組開始往後讀取四個位元組,間接訪問得出此四個位元組代表的數值,並以十六進製制輸出。

那麼問題來了,為什麼是

2000000

,陣列的整型元素在記憶體中是怎麼儲存的?這四個位元組記憶體的是怎樣的二進位制數?為什麼會這樣儲存?

經過度娘的幫助,它終於出現了

——大小端模式

小端模式

小端模式是指資料的高位儲存在記憶體的高位址中,而資料的低位儲存在記憶體的低位址中。

為什麼會有大小端模式

在計算機系統中,位址是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了乙個位元組(8bit)的char之外,還有兩個位元組(16bit)的short型等超過乙個位元組的資料型別。另外,對於位數大於 8位的處理器,由於暫存器寬度大於乙個位元組。所以必然存在如何將多個位元組安排的問題,因此就有了大端儲存模式和小端儲存模式。

呀哈名字由來

**《格列夫遊記》中,小人國內部**成big-endian和little-endian兩派,區別在於一派要求從雞蛋的大頭把雞蛋打破,另一派要求從雞蛋的小頭把雞蛋打破。斯威夫特藉以諷刺英國的政黨之爭,在計算機工業中指資料儲存順序的分歧。

測試大小端

乙個簡單的判斷資料儲存模式為大端模式還是小端模式。

#include

int main()

輸出:little

我的是小端模式

回歸面試題

a[5] = ;

擷取第二個位元組到第五個位元組

大端模式:

0x00 0x00 0x01 0x00

小端模式:

0x00 0x00 0x00 0x02

讀取資料

大端模式:

從高位址往低位址讀取

0x00 0x00 0x01 0x00

讀取資料轉換為十六進製制為100

小端模式:

從低位址往高位址讀取

0x00 0x00 0x00 0x02

排成大端(0x02 0x00 0x00 0x00)

讀取資料轉換為十六進製制為2000000

所以在大端模式下,結果為100。

在小端模式下,結果為2000000。

大小端模式詳解及其測定

大小端的寓言故事 有關大小端的爭論,最早來自於 格列夫遊記 裡乙個有趣的故事 lilliput和blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因 大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於小時侯吃雞蛋,按這種方法把手指弄破了,因此他的父親,就...

大小端模式

偶 注意 大小端的高低位資料是按位址來計算的。如0x1001,10是高位位元組,01是低位位元組。char s abcd a是高位位元組 所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順...

大小端模式

所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...