1. 程式人生 > >使用C語言判斷一個機器是大端機還是小端機

使用C語言判斷一個機器是大端機還是小端機

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;
}

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

將一個整型資料賦給字元型資料,通過檢視字元型資料的值來判定是大端機還是小端機。將整型賦給字元型,會發生資料的丟失。如果是大端機,則會丟失低位元組;如果是小端機,則會丟失高位元組。和第一種方法很類似,一個是檢視整型的值,一個是檢視字元型的值。

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

	return 0;
}

輸出結果:

~O(∩_∩)O~