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