在看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型別是共享記...