史上最全的C位域總結【轉】

通過我的查閱相關的資料和理解,現對C語言的位域作一個總結,對於位域的定義我在這裏沒有多說,我這裏主要是對位域有歧義的地方進行系統的總結.我我的以爲總結的比較完整,若有不夠完整或有異義的地方你們能夠留言指點.
1.位域又叫位段(位字段),是一種特殊的結構成員聯合成員(即只能用在結構或聯合中),用於指定該成員在內存存儲時所佔用的位數,從而能夠在機內更緊湊地表示數據。
2.位域的使用主要出如今以下兩種狀況:
 (1)當機器可用內存空間較少而使用位域能夠大量節省內存時。如,當把結構做爲大數組的元素時。
 (2)當須要把一結構或聯合映射成某預約的組織結構時。例如,當須要訪問字節內的特定位時。
3. 當要把某個成員說明成位域時,其類型只能是int,unsigned int與signed int三者之一(說明:int類型一般表明特定機器中整數的天然長度。short類型一般爲16位,long類型一般爲32位,int類型能夠爲16位或 32位.各編譯器能夠根據硬件特性自主選擇合適的類型長度.見The C Programming Language中文 P32)。
4.帶位域的結構在內存中各個位域的存儲方式取決於具體的編譯程序;它們既能夠從左到右,也能夠從右到左存儲。
5.在一包含位域說明的強構或聯合區分符中也能夠同時說明普通成員,例如:
    struct st1
    {
       unsigned a:7;
       unsigned b:4;
       unsigned c:5;
       int      i;     //i是普通成員,這會被存放在下一個字,即字對齊
     };
6.int值不能跨字存放,一樣位域也最好不要跨字存放(意思說是說:各位域的分配位數加起來要在16位或32位之內,若是編譯器分配int爲16位,則加起來要在16位之內,若是加起來大於16位,則最好空出剩餘的位域,從下一個字開始分配位域).
7.特殊寬度0或者說長度爲0的無名位域有着特殊的用途.它用於指示將其先後的兩個位域或成員分開放在兩個字中, 即將位於該無名位域後的下一個位域從下一個字開始存放.
8.位域備註:
關於位域還須要提醒讀者注意以下幾點:
其一,位域的長度不能大於int對象所佔用的字位數.例如,若int對象佔用16位,則以下位域說明是錯誤的:
     unsigned int x:17;
其二,因爲位域的實現會因編譯程序的不一樣而不一樣,在此使用位域會影響程序的可移植性,在不是非要使用位域不可時最好不要使用位域.
其三,儘管使用位域能夠節省內存空間,但卻增長了處理時間,在爲當訪問各個位域成員時須要把位域從它所在的字中分解出來或反過來把一值壓縮存到位域所在的字位中.
其四,位域的位置不能訪問,因些不能對位域使用地址運算符號&(而對非位域成員則可使用該運算符).從而,即不能使用指向位域的旨針也不能使用位域的數組(由於數組實際上就是一種特殊的指針).另外,位域也不能做爲函數返回的結果.
最後還要強調一遍:位域又叫位段(位字段),是一種特殊的結構成員或聯合成員(即只能用在結構或聯合中).html

說明:以上大多數文字摘自《ANSI C標準詳解》及《The C Programming Language中文第二新版》.在此對以上兩本參考書的團體表示感謝.
   加速度 March.6.2010數組

原文:http://blog.21ic.com/user1/6121/archives/2010/67210.html函數

相關文章
相關標籤/搜索