C语言程序判断计算机的CPU大小端
如何判斷一臺計算機的CPU是大端還是小字端對齊呢?
那么首先得了解何為大端,何為小端,明確一下概念。
所謂大端模式,是指字數(shù)據(jù)的高字節(jié)存儲在低地址中,而字數(shù)據(jù)的低字節(jié)則存放在高地址中。
小端格式:與大端存儲格式相反,在小端存儲格式中,低地址中存放的是字數(shù)據(jù)的低字節(jié),高地址存放的是字數(shù)據(jù)的高字節(jié)。
Big-Endian 和 Little-Endian 字節(jié)排序 ??
? 字節(jié)排序? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??含義
Big-Endian? ? 一個Word中的高位的Byte放在內(nèi)存中這個Word區(qū)域的低地址處。 Little-Endian??一個Word中的低位的Byte放在內(nèi)存中這個Word區(qū)域的低地址處。
必須注意的是:表中一個Word的長度是16位,一個Byte的長度是8位。如果一個數(shù)超過一個Word的長度,必須先按Word分成若干部分,然后每一部分(即每個Word內(nèi)部)按Big-Endian或者Little-Endian的不同操作來處理字節(jié)。 一個例子: 如果我們將0x1234abcd寫入到以0x0000開始的內(nèi)存中,則結(jié)果為 ? ?????????????? big-endian? ??? little-endian 0x0000? ?? ?0x12? ?? ?????????? 0xcd 0x0001? ?? ?0x34? ?? ????????? 0xab 0x0002? ?? ?0xab? ?? ? ? ? ? ? 0x34 0x0003? ?? ?0xcd? ?? ????????? 0x12 除了moto的68K系列和dec的sparc是big endian外,常見的cpu都是little endian。ARM同時支持 big和little,實際應(yīng)用中通常使用little endian,,Intel系列的CPU就是little endian的。
那么如何使用C語言程序判斷CPU是大端還是小端對齊呢?
有幾個方法:
方法一:直接使用看變量的內(nèi)存值,這里需要使用一些調(diào)試技巧。
#includevoid?main(){short?s=0x1234;char?*?pTest=(char*)&s;printf("%p?%0X?%0X",&s,pTest[0],pTest[1]);}以十六進制輸出short型變量s在內(nèi)存中的字節(jié)分布。
運行結(jié)果為:
????????????????????? 0012FF7C
????????????????????? 34 12
方法二:使用C中的共用體:
請寫一個C函數(shù),若處理器是Big_endian的,則返回false;若是Little_endian的,則返回true。
bool IsLitte_Endian()
??????????? {
??????????????? union w{
????????????????????????????????? int a;
????????????????????????????????? char b;
?????????????? }c;
????????????? c.a=1;
????????????? return (c.b==1);
??????????? }
方法三:強制類型轉(zhuǎn)換,和共用體的做法差不多。
?????????? bool IsLitte_Endian()
??????????? {
??????????????????? int wTest = 0x12345678;
?????????????????? short *pTest=(short*)&wTest;
?????????????????? return !(0x1234 == pTest[0]);
??????????? }
聲明:
本文于網(wǎng)絡(luò)整理,版權(quán)歸原作者所有,如來源信息有誤或侵犯權(quán)益,請聯(lián)系我們刪除或授權(quán)事宜。
總結(jié)
以上是生活随笔為你收集整理的C语言程序判断计算机的CPU大小端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7个C语言小程序让你快速入门程序世界
- 下一篇: C语言 | 为什么写这三行代码