C 如何判斷當(dāng)前系統(tǒng)使用的是大端還是小端存儲
今天使用%lx格式打印了一下小數(shù)33.3的16進(jìn)制形式;輸出為4040a66666666666;在打斷點的時候查看了下內(nèi)存中其存儲如下圖:

從上圖看,隨著內(nèi)存增大,先存儲低位數(shù)據(jù)再存儲高位數(shù)據(jù),這明顯是小端存儲的風(fēng)格;(關(guān)于大小端可以看我的這篇博客:C 大端存儲與小端存儲)
我的思考:如何讓別人快速知道自己的系統(tǒng)是大端還是小端存儲?
在網(wǎng)上找到了其他博主的思路:
- 對于1這個整數(shù),由于清楚它的2進(jìn)制和16進(jìn)制表示形式:0000 0000 0000 0000 0000 0000 0000 0001 (2進(jìn)制) 00 00 00 01 (16進(jìn)制)
- 如果是小端存儲,那么在內(nèi)存中它的存儲形式應(yīng)該是:01 00 00 00;如果是大端存儲,那么在內(nèi)存中它的存儲形式應(yīng)該是:00 00 00 01
- 巧用地址法,將存儲1的變量a的地址交給char類型指針pchar;這樣使用*pchar取值后得到的正好是第一個字節(jié)處的值;
- 定義一個范圍值為int的函數(shù),將*pchar返回。
代碼如下
#include <stdio.h>
int is_little_endian() {
int a = 1;
char *pchar = (char *) &a;
return *pchar;
}
int main(void) {
printf("當(dāng)前系統(tǒng)是否為小端存儲: %d\n", is_little_endian());
return 0;
}
//輸出:當(dāng)前系統(tǒng)是否為小端存儲: 1

浙公網(wǎng)安備 33010602011771號