如何用C語言中的union檢測CPU的端模式

2021-06-04 05:51:00 字數 1050 閱讀 6754

在看c++的時候,看到了union(共用體),同時想起在面試的時候,也經常被問到計算機大小端的測試方法,由此便寫下這篇博文。

計算機的大小端問題由來已久,具體的歷史大家可以看看維基百科裡邊是怎麼簡述的,還是挺不錯的哦!~~

這裡講講計算機裡的大小端模式:

端模式首位元組

中間位元組

尾位元組大端

最高有效位

…最低有效位

小端最低有效位

…最高有效位

如果將乙個16位的整數0x1234存放到乙個短整型變數(short)中。這個短整型變數在記憶體中的儲存在大小端模式由下表所示。

位址偏移

大端模式

小端模式

0x00

0x01

而在c語言中union是乙個很特別的結構,它是把幾種不同型別的變數存放到同一段記憶體中。而對union型成員的訪問都是相對於該聯合體基位址的偏移量為0處開始,也就是聯合體的訪問不論對哪個變數的訪問都是從union的首位址位置開始的。利用這個特性,我們可以判斷當前系統是大端還是小端。

下表可以很清晰的看出union在不同端模式下的儲存方式:

大端模式

小端模式

位址偏移量

型別位址偏移量

型別short

char

short

char

0x000000

1212

0x000000

3434

0x000001

34系統資料

0x000001

12系統資料

若以上述16位的整數0x1234為例

下面就看看如何用c語言的union來檢測行x86cpu的端模式:

/*

test environment: dev-c++ 5.1.0.0

test result:

the compute is little-endian.*/

#include #include union data;

int main(void)

C語言中union的含義

union是一種資料型別,跟struct型別有點類似,其形式為 union 聯合名 聯合變數名 聯合表示幾個變數共用乙個記憶體位置,在不同的時間儲存不同的資料型別和不同的資料長度。當乙個聯合被說明時,編譯程式自動的產生乙個變數,其長度為聯合中最大的變數長度。聯合成員的訪問方法跟結構的一樣。struc...

C語言中的聯合體union

在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記...

C語言中的聯合體union

在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記...