聯合體
用於計算機程序彙編的數據結構
在進行某些演演算法的C語言編程的時候,需要使幾種不同類型的變數存放到同一段內存單元中。也就是使用覆蓋技術,幾個變數互相覆蓋。這種幾個不同的變數共同佔用一段內存的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體,也叫聯合體。
是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,僅僅用了一條減法指令就達到了除法、取余的操作,在進行高頻率定時時尤為有用。
所謂聯合體投標,是指兩個以上法人或者其他組織組成一個聯合體,以一個投標人的身份共同投標的行為。在國際招標投標中,是經常被採用的投標形式.對於聯合體投標可作如下理解:
1.聯合體承包的聯合各方為法人或者法人之外的其他組織。形式可以是兩個以上法人組成的聯合體、兩個以上非法人組織組成的聯合體、或者是法人與其他組織組成的聯合體。
2.聯合體是一個臨時性的組織,不具有法人資格。組成聯合體的目的是增強投標競爭能力,減少聯合體各方因支付巨額履約保證而產生的資金負擔,分散聯合體各方的投標風險,彌補有關各方技術力量的相對不足,提高共同承擔的項目完工的可靠性。如果屬於共同註冊並進行長期的經營活動的“合資公司”等法人形式的聯合體,則不屬於《招標投標法》所稱 的聯合體。
3.聯合體的組成是“可以組成”,也可以不組成。是否組成聯合體由聯合體各方自己決定。對此《招標投標法》第三十一條第四款也有相應的規定。這說明聯合體的組成屬於各方自願的共同的一致的法律行為。
4.聯合體對外“以一個投標人的身份共同投標”。也就是說,聯合體雖然不是一個法人組織,但是對外投標應以所有組成聯合體各方的共同的名義進行,不能以其中一個主體或者兩個主體(多個主體的情況下)的名義進行,即“聯合體各方”“共同與招標人簽訂合同”。這裡需要說明的是,聯合體內部之間權利、義務、責任的承擔等問題則需要依據聯合體各方 訂立的合同為依據。
5.聯合體共同投標的聯合體各方應具備一定的條件。比如,根據《招標投標法》的規定,聯合體各方均應具備承擔招標項目的相應能力;國家有關規定或者招標文件對投標人資格條件有規定的,聯合體各方均應當具備規定的相應資格條件。
6.聯合體共同投標一般適用於大型建設項目和結構複雜的建設項目。對此《建築法》第 二十七條有類似的規定。
聯合體投標申請資格預審必須符合以下要求:
⒈參加聯合的所有成員都應分別填寫完整的資格預審表格,且不允許任何單位提交或參加一個以上的投標.
⒉資格預審申請書中須指明為首的主辦人,招標人與聯合體之間的任何聯繫將通過為首的主辦人進行.
⒊申請書必須確認,如果資格預審合格后聯合體參加投標,投標文件及今後可能被授予的合同都將由所有合伙人簽署,以便使法律對全體合伙人共同並分別具有約束力.
⒋申請書必須說明擬議中每個合伙人的參與情況及其責任.
除以上特殊條件外,其他方面與前述單獨申請資格預審的要求基本一致.