複製鏈接
請複製以下鏈接發送給好友

聯合體

鎖定
在進行某些算法的C語言編程的時候,需要使幾種不同類型的變量存放到同一段內存單元中。也就是使用覆蓋技術,幾個變量互相覆蓋。這種幾個不同的變量共同佔用一段內存的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體,也叫聯合體。
中文名
聯合體
外文名
union
又    稱
共用體
所屬領域
計算機

聯合體基本定義

是union 的中文解釋,又稱為共用體。

聯合體主要用途

各種程序語言 都有這種數據結構
彙編, C語言, C++ 都有這種數據類型
它就是把各種基本類型捆綁在一起。

聯合體特別之處

“聯合”與“結構”有一些相似之處。但兩者有本質上的不同。在結構中各成員有各自的內存空間,一個結構體變量的總長度大於等於各成員長度之和。而在“聯合”中,各成員共享一段內存空間,一個聯合變量的長度等於各成員中最長的長度。應該説明的是,這裏所謂的共享不是指把多個成員同時裝入一個聯合變量內,而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值,賦入新值則衝去舊值。如下面介紹的“單位”變量,如定義為一個可裝入“班級”或“教研室”的聯合後,就允許賦予整型值(班級)或字符型(教研室)。要麼賦予整型值,要麼賦予字符型,不能把兩者同時賦予它。聯合類型的定義和聯合變量的説明:一個聯合類型必須經過定義之後,才能把變量説明為該聯合類型。

聯合體應用詳情

聯合的定義
定義一個聯合類型的一般形式為:
union 聯合名
{
成員表
};
成員表中含有若干成員,成員的一般形式為: 類型説明符 成員名
成員名的命名應符合標識符的規定。
例如:
union perdata
{
int Class;
char Office;
};
定義了一個名為perdata的聯合類型,它含有兩個成員,一個為整型,成員名為Class;另一個為字符,字符名為Office。聯合定義之後,即可進行聯合變量聲明,被聲明為perdata類型的變量,可以存放整型量Class或存放字符型的變量Office。
聯合變量的聲明
聯合變量的聲明和結構變量的聲明方式相同,也有三種形式。即先定義,再聲明;定義同時聲明和直接聲明。
以perdata類型為例,聲明如下:
union perdata
{
int Class;
char Office;
};
union perdata a,b;
或者可同時説明為:
union perdata
{
int Class;
char Office;
}a,b;
或直接説明為:
union
{
int Class;
char Office;
}a,b;
經説明後的a,b變量均為perdata類型。a,b變量的長度應等於 perdata 的成員類型中最長的長度,即等於
Class的長度,共4個字節。從圖中可見,a,b變量如賦予整型值時,只使用了4個字節,而賦予字符時,可用1個字節。
聯合體在單片機中的應用
單片機中經常會遇見分離高低字節的操作,比如進行計時中斷復位操作時往往會進行
(65535-200)/256,(65535-200)%256這樣的操作,而一個除法消耗四個機器週期,取餘也需要進行一系列複雜的運算,如果在短時間內需要進行很多次這樣的運算無疑會給程序帶來巨大的負擔。其實進行這些操作的時候我們需要的僅僅是高低字節的數據分離而已,這樣利用聯合體我們很容易降低這部分開銷。
代碼:
union chufa{
int n; //n中存放要進行分離高低字節的數據
char a[2]; //在keil c中一個整形佔兩個字節,char佔一個字節,所以n與數組a佔的字節數相同
}test;
test.n=65535-200; //進行完這句後就一切ok了,下面通過訪問test中數組a的數據來取出高低字節的數據
TH1=test.a[0]; //test.a[0]中存儲的是高位數據,這是由於keil的特性(此處應該有誤,聯合體內數據是按地址對齊的。具體是高位數據還是低位數據要看平台的大小端模式,51是大端,stm32默認是小端),如果其他編譯器還請自測
TL1=test.a[1]; //test.a[1]中儲存了test.n的低位數據
!that's good,僅僅用了一條減法指令就達到了除法、取餘的操作,在進行高頻率定時時尤為有用。