CS:APP 2.58 判斷機器是否爲小端模式

CS:APP 家庭作業

2.58

編寫過程is_little_endian,當在小端法機器上編譯和運行時返回1,在大端法機器上編譯和運行時則返回0.這個程序應該可以編譯和運行在任何機器上,無論機器的字長是多少。

思考過程
排列表示一個對象的字節有兩個通用的規則,即大端法和小端法。假設變量x的類型爲int,位於地址 0x100 處,它的十六進制爲 0x01234567。地址範圍 0x100 ~ 0x103 的字節順序依賴於機器的類型:

大端法

0x100 0x101 0x102 0x103
01 23 45 67

小端法

0x100 0x101 0x102 0x103
67 45 23 01

據此,當了解字節在內存中存放的順序時即可判斷該機器是否使用小端模式。於是,不妨藉助聯合(union)來訪問特定的內存塊,並根據特定內存塊的值判斷該機器是否使用小端模式(當然也可以使用強制類型轉換)。

代碼

union {
    int16_t i;
    char c[2];
} u;

int is_little_endian (void) {
    u.i = 0x0001;
    if (u.c[0] != 0)
        return 1;
    else
        return 0;
}

大端法和小端法對編程的影響

  • 不同類型的機器之間通過網絡傳送二進制數據時
  • 閱讀表示整數數據的字節序列時(反彙編)
  • 編寫含有強制類型轉換(cast)聯合(union)的程序時

參考資料:《深入理解計算機系統》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章