碼字不易,對你有幫助
點贊👍/轉發↪️/關注 👀 支持一下作者
微信搜公衆號:不會編程的程序圓 看更多幹貨,獲取第一時間更新
如何用程序判斷自己的機器是大端還是小端?
通常情況下,我們的計算機都是小端存儲模式。
小端:數字的低位存儲到內存的低地址上。
大端:數字的低位存儲到內存的高地址上。
我們在 VS 中創建一個臨時變臉
int a = 0x11223344;// 十六進制數
然後打開調試器,看到變量 a 在內存中是這樣存儲的:
0x0133FC50 44 33 22 11
對於 Vs 調試中內存窗口的這行信息應該如何理解呢?它就表示:
十六進制數每兩位表示一個字節,地址也是十六進制數;int 類型在 32 位機器上大小爲 4 個字節。
如何理解十六進制數每兩位表示一個字節?
十六進制數每一位的取值範圍是 0 ~ 15,表示 16 種不同可能,對應 4 個二進制位(0000 ~ 1111),所以每一位十六進制可以表示 4 個二進制位,那麼兩個十六進制位就表示 8 個二進制位,也就是 1 個字節。
可以看到,在我的機器上,低位 44 存儲在 低地址(0x0133FC50)上,所以我的機器是 小端存儲模式。
如果是大端存儲模式,變量 a 在內存中的存儲應該如下圖所示:
現在,讓我們用程序來驗證一下我們的機器到底是大端還是小端。
方法一
#include<stdio.h>
int main(void) {
int a = 0x11223344;
int* pi = &a;
char* pc = (char*)pi;//指針強轉
printf("%x\n", *pc);//輸出 44 ,得到證實
return 0;
}
方法二
#include<stdio.h>
typedef union {
int a;
char ch[sizeof(int)];
}BOS;//big or small
int main(void) {
BOS bos;
bos.a = 0x11223344;
printf("%x", (unsigned int)bos.ch[0]);//輸出 44
return 0;
}
如果本文你有地方沒有看懂,推薦閱讀以下文章,可以幫助你理解:
推薦閱讀:
以上就是本次的內容。
如果文章有錯誤歡迎指正和補充,感謝!
最後,如果你還有什麼問題或者想知道到的,可以 在評論區/私信 告訴我呦,我可以在後面的文章加上你的真知灼見👁。
關注我,看更多幹貨!
我是程序圓,我們下次再見。🍂