C結構體之位域(位段)

2021-07-03 21:44:23 字數 1775 閱讀 2738

有些資訊在儲存時,並不需要占用乙個完整的位元組, 而只需佔幾個或乙個二進位制位。

例如在存放乙個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為「位域」或「位段」。所謂「位域」是把乙個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有乙個網域名稱,允許在程式中按網域名稱進行操作。 這樣就可以把幾個不同的物件用乙個位元組的二進位制位域來表示。

位段的宣告和普通的結構體成員宣告還是有一些區別的,區別如下:

1、位段成員必須宣告為int、unsigned int或signed int型別;

2、在成員名的後面是乙個冒號和乙個整數,這個整數指定該位段所占用的位的數目。

一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為: 

struct 位域結構名  ;
其中位域列表的形式為:

型別說明符 位網域名稱:位域長度
位域變數的說明與結構變數說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:

struct bs data;

說明data為bs變數,共佔兩個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。對於位域的定義尚有以下幾點說明:

1. 乙個位域必須儲存在同乙個位元組中,不能跨兩個位元組

struct bs

所以,a占用了乙個位元組,b占用了乙個位元組,c也占用了乙個位元組,其實只要將b和c的位置換一換,將只需要占用兩個位元組。
2. 由於位域不允許跨兩個位元組,因此位域的長度不能大於乙個位元組的長度

。3. 位域可以無位網域名稱

,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

struct k ;
二、位域的使用

下面例子是參加乙個公司(白領科技-青島)的筆試遇到的,當時做錯了,為了怕忘了,趕緊寫下來。

struct a ; int main(void)
解析:上例程式中定義了位域結構a,兩個個位域為a(占用5位),b(占用3位),所以a和b總共占用了結構a乙個位元組(低位的乙個位元組)。
由於是32位處理器,而且結構體中a和b元素型別均為int(也是4個位元組),所以結構體的a占用記憶體為4個位元組。(即結構體所佔的位元組數必須要被4整除)
當程式執行到14行時,d記憶體分配情況:

高位 00110100 00110011 00110001 00110000 低位

'4' '3' '1' '0' //上面一行是用二進位制表示的。

其中d.a和d.b占用d低位乙個位元組(00110000),d.a : 10000, d.b : 001

d.a記憶體中二進位制表示為10000,由於d.a為有符號的整型變數,輸出時要對符號位進行擴充套件,所以結果為-16(二進位制為11111111111111111111111111110000)

d.b記憶體中二進位制表示為001,由於d.b為有符號的整型變數,輸出時要對符號位進行擴充套件,所以結果為1(二進位制為00000000000000000000000000000001)

執行結果為:

使用位段只是基於方便的目的,任何可以用位段實現的任務都可以使用移位和遮蔽來實現。

位段提供的唯一優點是:簡化了源**,當然,這個優點必須與位段的移植性較弱這個缺點進行權衡。

C結構體之位域 位段

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

C結構體之位域(位段)

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

C結構體之位域(位段)

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