C語言中的位域

2021-08-26 02:14:51 字數 1428 閱讀 6371

struct 位域結構名

;

1、使用位域可能不如使用位運算子的執行速度快,但是位域使程式更容易閱讀。

2、如果某個作用域中定義了位域結構,則在該作用域中就不能使用typedef或#define來定義與位域結構名相同的型別名。

3、在之前的標準中,位域型別必須是int、unsigned int或signed int。使用int會引起二義性,因為一些編譯器將位域的最高位作為符號位,而其他一些編譯器則不會;另一方面,如果使用signed int型別若使用到了正負,也會存在問題。故建議使用unsigned int型別。

在c99新標準中,編譯器還允許使用_bool型別,不過一些編譯器在具體實現時,額外支援了char、unsigned char、signed char、enum型別。

4、每個位域結構都會定義自己的作用域,所以花括號內部定義的位網域名稱可以和其他作用域中的變數同名,而內部不可以同名。

α、c語言允許省略位域的名字。

5、占用位的長度可以根據需要進行配置,但是不能超過位於型別所佔的總位數。

β、在省略位網域名稱時可以為零。

6、c語言不允許將&運算子用於位域,所以,向scanf這樣的函式無法直接向位域中儲存資料。可以通過使用乙個臨時變數的方法間接儲存。

7、位域記憶體分布

7.1、當編譯器處理位域這種結構的宣告時,會將位域逐個放入儲存單元,位域之間沒有間隙,直到剩下的空間不夠用來放下乙個位域了。這時,一些編譯器會跳到下乙個儲存單元的開始,另一些則會將位域拆開跨儲存單元存放。位域的存放循序(從左到右還是從右到左)也由實現決定。

7.2、上面第4點提到的省略位網域名稱,經常用來作為欄位間的「填充」,以保證其它位域儲存在適當的位置。

7.3(γ)、另乙個用來控制位域儲存的技巧是指定未命名的字段長度為0。這是給編譯器乙個訊號,告訴編譯器將下乙個位域在乙個儲存單元的起始位置對齊。

7.4、

相鄰位域字段的型別

位寬之和與型別比較

結果相同

小於緊鄰的儲存在該型別大小的空間中(壓縮)

相同大於

大於的部分從下乙個該型別大小的空間中開始儲存

不同依編譯器而定,(gcc會壓縮,vs、vc不會)

7.5、只有相鄰的位域才能被壓縮,若位域列表之間有乙個非位域則會被分成兩部分,兩部分單獨考慮。

7.6、因為存在資料記憶體對齊問題,所以整個位域結構體的總大小為最寬基本型別成員大小的整數倍,這一點與結構體型別是一致的。

8、若位段出現在表示式中,則會自動進行整型提公升,轉換為int或unsigned int。

總結:位域使用的最佳策略是:

1、位域的型別要使用合適的且占用記憶體最小的無符號型別。

2、整個位域列表盡量使用相同的型別(資料對齊問題會引起不必要的記憶體消耗)。

2、不要在位域列表中間插入非位域。

3、合理的布局位域列表的順序。

C語言中位域

引自 這是c語言位域 冒號 問題 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為...

C語言中的位域

2 當相鄰成員的型別不同時,不同的編譯器有不同的實現方案,gcc會壓縮儲存,而vc vs不會 請看下面的位域 bs include int main printf d n sizeof struct bs return 0 3 如果成員之間穿插著非位域成員,那麼不會進行壓縮。例如對於下面的 bs i...

C語言中的位域的使用

一 位域 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個...