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)的程序時
參考資料:《深入理解計算機系統》