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