一、大端模式&小端模式
所謂的「大端模式」,是指數據的低位(就是權值較小的後面那幾位)保存在內存的高地址中,而數據的高位,保存在內存的低地址中,這樣的存儲模式有點兒類似於把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放;
所謂的「小端模式」,是指數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
如果將一個32位的整數0x12345678 存放到一個整型變量(int)中,這個整型變量採用大端或者小端模式在內存中的存儲由下表所示。為簡單起見,本文使用OP0表示一個32位數據的最高字節MSB(Most Significant Byte),使用OP3表示一個32位數據最低字節LSB(Least Significant Byte)。
地址偏移 大端模式 小端模式
0x00 12(OP0) 78(OP3)
0x01 34(OP1) 56(OP2)
0x02 56(OP2) 34(OP1)
0x03 78(OP3) 12(OP0)
小端:較高的有效字節存放在較高的存儲器地址,較低的有效字節存放在較低的存儲器地址。
大端:較高的有效字節存放在較低的存儲器地址,較低的有效字節存放在較高的存儲器地址。
採用大小模式對數據進行存放的主要區別在於在存放的字節順序,大端方式將高位存放在低地址,小端方式將高位存放在高地址。採用大端方式進行數據存放符合人類的正常思維,而採用小端方式進行數據存放利於計算機處理。到目前為止,採用大端或者小端進行數據存放,其孰優孰劣也沒有定論。
下面這段代碼可以用來測試一下你的編譯器是大端模式還是小端模式:
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址單元
x1=((char*)&x)[1]; //高地址單元
若x0=0x11,則是大端; 若x0=0x22,則是小端......
上面的程序還可以看出,數據尋址時,用的是低位字節的地址
二、入棧地址高低問題
入棧地址高低問題
堆棧是在內存中指定的一段特殊存儲區,存起始單元的地址叫棧底,當前存儲單元地址叫棧頂,堆棧存儲區一旦指定,棧底就固定不變了,而棧頂是隨入棧、出棧操作呈動態。而不同機型的堆棧設計,有兩種情況:一是每入棧一個數,棧頂地址加1,每出棧一個數,棧頂地址減1,即堆棧區是由內存的低地址向高地址。另一種是每入棧一個數,棧頂地址減1,每出棧一個數,棧頂地址加1,即堆棧區是由內存的高地址向低地址。高地址、低地址是相對而言,即相對地址編碼的大小而言。