面試題集錦

大端小端

#include <stdio.h>

int main(int argc, char *argv[])
{
    int arr[] = {0x61626364, 0x65006667};
    printf("%s\n", (char *)arr);

    return 0;
}

如上所示,這段代碼輸出什麼?如果有錯誤,請解釋。
從C的角度看,這段代碼把一個整形數組按照字符串的形式輸出。C裏面的字符串,其實就是一個字節序列,以'\0'結束。那麼,核心問題就在於整數在字節層面是怎麼表示的,也就是所謂的字節序。
什麼是字節序?每個學計算機的都知道32位系統下,一個整型是4個字節。但是,這4個字節到底是怎麼排列的呢?比如一個十六進制數0x01020304,有4個字節0x01,0x02,0x03和0x04,這四個字節在內存中可以有4*3*2*1=24種排列方式!到底是哪種?當然,世界沒有那麼坑,計算機系統只採用兩種排列方式:一種是0x04,0x03,0x02,0x01,即把數據的低字節存在內存的低地址(靠前),這就是所謂的小端系統;另外一種剛好相反,把數據的高字節存在內存的低地址,這就是所謂的大端系統。
回到上面的代碼片段,假設系統是32位小端系統(大部分機器都是),看看C整型數值在內存中是怎麼佈局的:
       +––––––+ <--- arr
low    | 0x64 | d
       +––––––+
       | 0x63 | c
       +––––––+
       | 0x62 | b
       +––––––+
       | 0x61 | a
       +––––––+
       | 0x67 | g
       +––––––+
       | 0x66 | f
       +––––––+ <--- end
       | 0x00 |
       +––––––+
high   | 0x65 | e
       +––––––+

這個整型數組包含兩個元素,總共是八個字節,從上往下,地址增高。將數組中兩個整型按照小端的方式填入這八個字節,如上圖。現在arr指向數組的開始地址,printf從該地址開始,逐一輸出每個字符(字節),直到遇到'\0',也就是0x00,end所指向的地方。那麼從arr到end之間6個字節存的到底是什麼字符呢?這個可以查ASCII表得知,0x61是小寫字母a,以此類推。現在答案很明顯了,程序輸出:dcbagf。不知你猜中沒?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章