聯合體(英文名:Union)也稱為聯合、共用體,是一種用戶定義的、由若干成員組成的類型。聯合體的多個數據成員共享同一塊存儲空間。對于一個聯合體變量,任一時刻只能使用其中一個成員,而且讀出數據的成員與寫入數據的成員應該相同。C++11放寬了聯合成員的類型范圍,引入非受限聯合體,語法上與結構類型一致,但加強了聯合的功能。與結構體不同的是,在內存分配時,聯合體是以其中所占內存最大的成員變量為準。
聯合體的各成員之間具有互斥的語義,這也有別于結構中各成員之間的共存關系。如大學課程成績有兩種表示方式,一種是等級方式,即A優、B良、C中、D及格、E不及格,用單個字符就可表示,另一種是百分制方式,用從0到100的一個浮點數表示,即由一個float就可表示。對于一門課程只能選擇其一,課程成績就可描述為一個聯合體類型。
基本定義
聯合體是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; //在keil c中一個整形占兩個字節,char占一個字節,所以n與數組a占的字節數相同
}test;
test.n=65535-200; //進行完這句后就一切ok了,下面通過訪問test中數組a的數據來取出高低字節的數據
TH1=test.a; //test.a中存儲的是高位數據,這是由于keil的特性(此處應該有誤,聯合體內數據是按地址對齊的。具體是高位數據還是低位數據要看平臺的大小端模式,51是大端,stm32默認是小端),如果其他編譯器還請自測
TL1=test.a; //test.a中儲存了test.n的低位數據
That's good,僅僅用了一條減法指令就達到了除法、取余的操作,在進行高頻率定時時尤為有用。
投標釋義
所謂聯合體投標,是指兩個以上法人或者其他組織組成一個聯合體,以一個投標人的身份共同投標的行為。在國際招標投標中,是經常被采用的投標形式.對于聯合體投標可作如下理解:
1.聯合體承包的聯合各方為法人或者法人之外的其他組織。形式可以是兩個以上法人組成的聯合體、兩個以上非法人組織組成的聯合體、或者是法人與其他組織組成的聯合體。
2.聯合體是一個臨時性的組織,不具有法人資格。組成聯合體的目的是增強投標競爭能力,減少聯合體各方因支付巨額履約保證而產生的資金負擔,分散聯合體各方的投標風險,彌補有關各方技術力量的相對不足,提高共同承擔的項目完工的可靠性。如果屬于共同注冊并進行長期的經營活動的“合資公司”等法人形式的聯合體,則不屬于《中華人民共和國招標投標法》所稱 的聯合體。
3.聯合體的組成是“可以組成”,也可以不組成。是否組成聯合體由聯合體各方自己決定。對此《招標投標法》第三十一條第四款也有相應的規定。這說明聯合體的組成屬于各方自愿的共同的一致的法律行為。
4.聯合體對外“以一個投標人的身份共同投標”。也就是說,聯合體雖然不是一個法人組織,但是對外投標應以所有組成聯合體各方的共同的名義進行,不能以其中一個主體或者兩個主體(多個主體的情況下)的名義進行,即“聯合體各方”“共同與招標人簽訂合同”。這里需要說明的是,聯合體內部之間權利、義務、責任的承擔等問題則需要依據聯合體各方 訂立的合同為依據。
5.聯合體共同投標的聯合體各方應具備一定的條件。比如,根據《中華人民共和國招標投標法》的規定,聯合體各方均應具備承擔招標項目的相應能力;國家有關規定或者招標文件對投標人資格條件有規定的,聯合體各方均應當具備規定的相應資格條件。
6.聯合體共同投標一般適用于大型建設項目和結構復雜的建設項目。對此《建筑法》第 二十七條有類似的規定。
聯合體投標申請資格預審必須符合以下要求:
⒈參加聯合的所有成員都應分別填寫完整的資格預審表格,且不允許任何單位提交或參加一個以上的投標.
⒉資格預審申請書中須指明為首的主辦人,招標人與聯合體之間的任何聯系將通過為首的主辦人進行.
⒊申請書必須確認,如果資格預審合格后聯合體參加投標,投標文件及今后可能被授予的合同都將由所有合伙人簽署,以便使法律對全體合伙人共同并分別具有約束力.
⒋申請書必須說明擬議中每個合伙人的參與情況及其責任.
除以上特殊條件外,其他方面與前述單獨申請資格預審的要求基本一致.
參考資料 >
共用體(聯合體)union.CSDN博客.2024-03-09