c裡面位段分析

2021-07-10 23:08:23 字數 1233 閱讀 8374

首先位段的定義為:

struct 位段結構name

;

例如:
struct date1

date1; //這裡a表示位網域名稱 1表示占用乙個bit

那資料如何在記憶體中儲存呢?

在網上找了個儲存原則:

如果結構體中含有位域(bit-field),那麼vc中準則是:

1) 如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止;

2) 如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍;

3) 如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮方式(不同位域字段存放在不同的位域型別位元組中),dev-c++和gcc都採取壓縮方式;

系統會先為結構體成員按照對齊方式分配空間和填塞(padding),然後對變數進行位域操作。

這樣可能有了一點簡單的了解:

再舉個例子分析一下:

struct date1

date1;

int main(void)

那莫在記憶體中儲存為(當然預設int佔4個byte) 

0000 0000 0000 0000 0000 0000 010

0 0001 紅色的位網域名稱為a 綠色為b

那麼printf 出來結果date1.a應該為1  .b應該為2

不過上面的例子稍微改一下,則結果將發生變化

struct date1

date1;

int main(void)

雖然在記憶體儲存沒有發生變化 但是a域讀取出來後 系統將對其進行符號擴充套件  那麼00001由於符號位為0 擴充套件為0000 0000 0000 0000 0000 0000 0000 0001

對於b擇優  1111 1111 1111 1111 1111 1111 1111 1110 那麼列印出來將是-2

另外還有一點需要注意:

那就是位段裡面是不能對位域取位址的 否則出錯

struct date1

date1;

或者struct date1

date1;

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語言又提供了一種資料結構,稱為位域或 位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位...