C和C 中的位域

2021-06-25 17:27:48 字數 1448 閱讀 8045

位域成員不能單獨被取sizeof值(編譯報錯),我們這裡要討論的是含有位域的結構體的sizeof,只是考慮到其特殊性而將其專門列了出來。

c99規定int、unsigned int和bool可以作為位域型別,但編譯器幾乎都對此作了擴充套件,允許其它型別型別的存在。使用位域的主要目的是壓縮儲存,其大致規則為:

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

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

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

4) 如果位域字段之間穿插著非位域字段,則不進行壓縮;

5) 整個結構體的總大小為最寬基本型別成員大小的整數倍。

和結構體一樣,位結構體也是按照成員的最大長度位元組來對齊分配空間的。

測試:struct test

;test t1;

int len=sizeof(t1);   //len=12,前兩個位域共用乙個char空間,按第三個位域long擴充套件為4位元組空間,最後乙個位域占用乙個char空間,按最長位域空間擴充套件為4位元組。

struct test

;test t1;

int len=sizeof(t1); //len=6,第一位域占用乙個char空間,按第二個位域short擴充套件為2位元組空間,最後乙個位域占用乙個char空間,按最長位域空間擴充套件為2位元組。

如果位域上的整形範圍值是0,則下個位域從新的位元組開始,前一字段後面空出的所有位元組都不使用(即使是同型別的位域),如:

struct bs

;sizeof(unsigned) == 4

上面這個位域定義中,a佔第一位元組的4位,第乙個位元組的後4位以及後面的3個位元組都填0表示不使用,b從新的位元組開始,占用4位,c占用4位。上面位結構體大小為:8

struct test

;test t1;

int len=sizeof(t1);   //len=8

struct test

;test t1;

int len=sizeof(t1);   //len=1

x;

unsigned char c;

} v;

v.c = 100;

printf("%d", v.x.s3);   }

結果:3

,從地位開始分配位空間

18.有關位域的面試題(為什麼輸出的是乙個奇怪的字元)

a.t = 'b';效果相當於 a.t= 'b' & 0xf;

'b' --> 01100010

'b' & 0xf -->>00000010

所以輸出ascii碼為2的特殊字元

C 中位域的說明

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

C語言位域和位段

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

C 中關於位域的概念

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