C語言位段問題

2021-06-23 02:44:06 字數 1375 閱讀 5421

**c語言中的位段

位段(bit-field)是以位為單位來定義結構體(或聯合體)中的成員變數所佔的空間。含有位段的結構體(聯合體)稱為位段結構。採用位段結構既能夠節省空間,又方便於操作。

位段的定義格式為:

type  [var]: digits

其中type只能為int,unsigned int,signed int三種型別(int型能不能表示負數視編譯器而定,比如vc中int就預設是signed int,能夠表示負數)。位段名稱var是可選引數,即可以省略。digits表示該位段所佔的二進位制位數。

那麼定義乙個位段結構可以像下面這段**去定義:

struct node

;

一.位段的使用

使用位段需注意一下幾點:

1)位段的型別只能是int,unsigned int,signed int三種型別,不能是char型或者浮點型;

2)位段佔的二進位制位數不能超過該基本型別所能表示的最大位數,比如在vc中int是佔4個位元組,那麼最多只能是32位;

3)無名位段不能被訪問,但是會佔據空間;

4)不能對位段進行取位址操作;

5)若位段佔的二進位制位數為0,則這個位段必須是無名位段,下乙個位段從下乙個位段儲存單元(這裡的位段儲存單元經測試在vc環境下是4個位元組)開始存放;

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

7)對位段賦值時,最好不要超過位段所能表示的最大範圍,否則可能會造成意想不到的結果。

8)位段不能出現陣列的形式。

二.位段結構在記憶體中的儲存方式

對於位段結構,編譯器會自動進行儲存空間的優化,主要有這幾條原則:

1)如果乙個位段儲存單元能夠儲存得下位段結構中的所有成員,那麼位段結構中的所有成員只能放在乙個位段儲存單元中,不能放在兩個位段儲存單元中;如果乙個位段儲存單元不能容納下位段結構中的所有成員,那麼從剩餘的位段從下乙個位段儲存單元開始存放。(在vc中位段儲存單元的大小是4位元組).

2)如果乙個位段結構中只有乙個占有0位的無名位段,則只佔1或0位元組的空間(c語言中是佔0位元組,而c++中佔1位元組);否則其他任何情況下,乙個位段結構所佔的空間至少是乙個位段儲存單元的大小;

測試程式:

按 ctrl+c 複製**

按 ctrl+c 複製**

執行結果為:

1 -1 -2 3

4 1 8 12 4

請按任意鍵繼續. . .

當列印s4的各個位段時,列印的結果與賦的初始值不同。

由於c只佔1位,那麼沒有資料位,此時進行符號擴充套件直接在高位新增1,所以列印的結果為-1;

由於d佔2位,那麼當將2賦給d時,記憶體中儲存的內容為10,此時進行符號擴充套件,高位補1,則為0xff ff ff fe,那麼其真值則為-2.

c語言 位段

位段 位段的宣告和結構是類似的,有兩個不同 1 位段的成員必須是int unsigned int char 或 signed int。2 位段的成員後邊有乙個冒號和乙個數字。例子 include include struct a struct b struct c int main 經過 驗證 1 ...

C語言位段

有時,儲存1個資訊不必占用1個位元組,只需二進位制的1個 或多個 位就夠用。如果仍然使用結構型別,則造成記憶體空間的浪費。為此,c語言引入了位段型別。位段的概念與定義 所謂位段型別,是一種特殊的結構型別,其所有成員均以二進位制位為單位定義長度,並稱成員為位段。例如,cpu的狀態暫存器,按位段型別定義...

C語言位域 位段

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如開關只有通電和斷電兩種狀態,用0和1表示足以,也就是用乙個二進位。所以c語言又提供了一種資料結構,稱為位域或 位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位...