學生在進行C語言復習的時候,看到這樣的代碼,進行了驗證,
我們在這想知道存放在p這一指針下里的值,我們的得出了如下結果,
學生對此表示不理解,雖然在x86系統中每一個存儲單元有32bit,指針的值加1應該是應該是越過了一個字節也就是8bit所以結果應該是0x0000100的結果才對,然而并不是這一結果。
之后我們對此進行了如下驗證,
試圖改變a+i來得出一些端倪,我們因此得到了如下結果,
我們似乎得到了一些想法,咱們的數據好像是正著存卻是反著讀的,并且我們回憶起了一個不是很常用,卻學過的關于大端小端的一個思想。
所謂的大端模式,是指數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址中;
所謂的小端模式,是指數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中。
為什么會有大小端模式之分呢?這是因為在計算機系統中,我們是以字節為單位的,每個地址單元都對應著一個字節,一個字節為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個字節,那么必然存在著一個如果將多個字節安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那么0x11為高字節,0x22為低字節。對于大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。
從大端小端的知識我們了解到我們用的x86結構應該是小端模式,所以我們的數據存儲的結構應該是這樣的:
10 00 00 00 20 00 00 00 30 00……
所以當我們的指針移動一個字節后,指向了第一個00的位置,而因為32bit存儲單元的原因,輸出是情況就是02 00 00 00的內容,因此出現的以上的情況。