結構體之位域詳解(C語言結構體中的冒號)

2021-10-02 08:03:55 字數 3094 閱讀 8535

在資料儲存時,有些時候並不需要占用乙個完整的位元組,比如數值 1, 只需要占用乙個bit(二進位制 1); 數值2 只需占用2個bit (二進位制 10)。 在這樣不需要太多bit來表示乙個數值時候,為了節省儲存空間,c語言提供了一種資料結構,稱之為「位域」,允許在程式中按照其網域名稱進行操作,這樣就可以使得多個不同的物件用乙個位元組中的若干個二進位制位域來表示。

以下具體介紹位域相關知識點

struct 位域結構名

;

以實際**為例,下面做兩種情況下的具體分析,

此段**為列印位域結構體資料的大小**,以下列出的各種情況都由此段**列印得出的結果。

int

main()

(排序情況: int,int,char)

typedef

struct struct_threshold_test

threshold_struct;

列印情況:

the struct

"threshold_test" size =

8

(排序情況: int,char,int)

typedef

struct struct_threshold_test

threshold_struct;

列印情況:

the struct

"threshold_test" size =

12

(排序情況: char,int,int)

typedef

struct struct_threshold_test

threshold_struct;

列印情況:

the struct

"threshold_test" size =

8

(位域長度依次為: 1, 4, 2)

typedef

struct struct_threshold_test

threshold_struct;

列印情況:

the struct

"threshold_test" size =

8

(位域長度依次為: 16, 16, 8)

typedef

struct struct_threshold_test

threshold_struct;

列印情況:

the struct

"threshold_test" size =

8

(位域長度依次為: 16, 17, 8)

typedef

struct struct_threshold_test

threshold_struct;

列印情況:

the struct

"threshold_test" size =

12

(1)第一步,根據結構體資料裡面所有的基本資料型別中占用儲存空間最大的基本資料型別作位元組對齊。

(2)第二步,如果相鄰的基本資料型別一致,則檢視兩者的位域長度之和是否大於此資料型別的儲存空間,大於則兩者之和的大小為兩個此型別的儲存空間;小於等於則兩者之和的大 小為單個此型別的儲存空間。

如果相鄰的資料型別不一致,則以占用儲存空間最大的基本資料型別作位元組對齊。

(3)第三步, 根據第

一、二步計算總大小。

typedef

struct struct_threshold_test

threshold_struct;(1

)第一步: 上面所有基本資料型別中,儲存空間最大的為int型別,占用位元組數為 4(2

)第二步: variableone, variabletwo變數兩者相鄰,均為int型別, 其位域之和為 1+4

=5;5

<

(sizeof

(int))

,所以變數variableone和variabletwo的占用儲存空間 為sizeof

(int

),即4位元組。(3

)第三步: variablethree變數型別為 char

,已知 sizeof

(char

)<

sizeof

(int

),所以按照int型別對齊,即占用空間為 4 位元組。所以這個位域的結構體資料總大小為

4+4=8 個位元組。

首先,我們來看一下以下**的列印值

typedef

struct struct_threshold_test

threshold_struct;

intmain()

//列印情況:

threshold_test.variableone =-1

threshold_test.variabletwo =-1

threshold_test.variablethree =

-2

奇怪,為什麼我的列印不是 1,15,2呢?怎麼會是 -1, -1, -2呢? 明明 1的二進位制就是乙個bit(1), 15的二進位制是4個bit(1000), 2的二進位制是 2個bit( 10). 怎麼%d列印的跟我設定的

變數不同呢???

其實原因在於,在有符號的基本資料型別定義的變數中,需要有乙個bit來儲存正負的標誌, 要想列印正常,只需要將上述變數的位域長度增加1,即可正常列印。

當然啦,也可以將變數定義為無符號型別,就不需要增加1個位也可以進行正常列印,如下:

typedef

struct struct_threshold_test

threshold_struct;

intmain()

//列印情況:

threshold_test.variableone =

1 threshold_test.variabletwo =

15 threshold_test.variablethree =

2

C語言結構體之位域

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

C語言結構體之位域

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

C結構體之位域

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