用C語言判斷大端還是小端


從別人那里COPY過來的,不是原創。

1.什么是大端,什么是小端?

大端:數據的高位字節存放在低地址內,數據的低位字節存放在高地址內。

小端:數據的高位字節存放在高地址內,數據的低位字節存放在低地址內。(低低,高高)

一個整型是4個字節,如:0x1a2b3c4d。電腦讀取內存數據時,是從低位地址到高位地址進行讀取(從左到右)。

在小端機器中從低地址到高地址的存放方式為:0x4d,0x3c,0x2b,0x1a;(低地址存低位,高地址存高位),地址從低到高增長

在大端機器中從低地址到高地址的存放方式為:0x1a,0x2b,0x3c,0x4d;(低地址存高位)

2.方法一:將字符數據賦給整型數據,通過讀取整型數據的值來判別大端還是小端

 

#include<iostream>
using namespace std;
int main()
{
unsigned int data = 0;
unsigned int *point = &data;
*(char*)point = 0x22;
if(data == 0x22)
cout << "這是一個小端機" << endl;
else if(data == 0x22000000)
cout << "這是一個大端機" << endl;
else
cout << "無法判定該機器類型" << endl;
return 0;
}

 

 

 

3.方法二:通過聯合體的共享內存特性,來判斷大端機、小端機

union是一個聯合體,所有變量公用一塊內存,在內存中的存儲是按最長的那個變量所需要的位數來開辟內存的。

#include<iostream>
using namespace std;

union UN{
char ch;
int data;
};

int main()
{
union UN un;
un.data = 0x1a2b3c4d;
if(un.ch == 0x4d)
cout << "這是一個小端機" << endl;
else if(un.ch == 0x1a)
cout << "這是一個大端機" << endl;
else
cout << "無法判定該機器" << endl;
return 0;
}

因為聯合體union的存放順序是所有成員都從低地址開始存放,利用該特性就可以輕松地獲得了CPU對內存采用Little-endian還是Big-endian模式讀寫。

4.方法三:通過指針來判斷

將一個整型數據賦給字符型數據,通過查看字符型數據的值來判定是大端機還是小端機。將整型賦給字符型,會發生數據的丟失。如果是大端機,則會丟失低字節;如果是小端機,則會丟失高字節。和第一種方法很類似,一個是查看整型的值,一個是查看字符型的值。

#include<iostream>
using namespace std;

int main()
{
int data = 1;
char* p = (char*)&data;
if(*p == 1)
cout << "這是一個小端機" << endl;
else if(*p == 0)
cout << "這是一個大端機" << endl;

return 0;
}

輸出結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM