從別人那里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;
}
輸出結果: