C的位結構體

2021-09-01 10:02:27 字數 2357 閱讀 3336

學習c有些時間了,知道有結構體,但是偶然知道它還有位結構體,查了些資料,也做了乙個實驗。

1.概念性描述:

位結構是一種特殊的結構, 在需按位訪問乙個位元組或字的多個位時, 位結構比按位運算子更加方便。

位結構定義的一般形式為:

struct  位結構名 位結構變數;

其中: 資料型別必須是整型(int/char/short)。 整型常數的範圍是資料型別的長度, 如定義為short,則範圍是1~16。

變數名是選擇項, 可以不命名, 這樣規定是為了排列需要。

例如: 下面定義了乙個位結構。

struct webpagech;

printf("%d\n",sizeof(struct webpage));輸出:2。

位結構成員的訪問與結構成員的訪問相同。

例如: 訪問上例位結構中的bgcolor成員可寫成:

ch.bgcolor

注意:

1. 乙個位域必須儲存在定義它的乙個資料型別內部,不能跨跨該資料型別。如char定義的位域所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。

2.由於位域不允許越過定義它的資料型別,因此位域的長度不能大於定義它的資料型別的長度。

3. 位結構總長度(位數), 是各個位成員定義的位數之和再向最大結構成員對齊。

4. 位結構成員可以與其它結構成員一起使用。

2.寫下面的**

#include "stdio.h"

int main()

x; unsigned short s;

unsigned int i ;

}v;v.i=0;

v.x.s1=1;

v.x.s2 =8;

v.x.s3=1;

printf("v.i = %d\n",v.i);

printf("v.s = %d\n",v.s);

printf("v.x.s1 = %d\n",v.x.s1) ;

printf("v.x.s2 = %d\n",v.x.s2) ;

printf("v.x.s3 = %d\n",v.x.s3) ;

v.s = 0x10a ;

printf("v.i = %d\n",v.i);

printf("v.s = %d\n",v.s);

printf("v.x.s1 = %d\n",v.x.s1) ;

printf("v.x.s2 = %d\n",v.x.s2) ;

printf("v.x.s3 = %d\n",v.x.s3) ;

printf("size:%d\n",sizeof(v));

return 0 ;

}

3.得出下面的結果

4.作以下的分析

上面的結構中都是3個3個的,用九位來分析,v.i=0;語句形成圖1的情況,除了這9位還有23位都是0 :

圖1:|        s3        |         s2        |        s1         | 

|  9  |  8 |  7  |  6  |  5  |  4  |  3  |  2  |  1  | 

|  0  |  0 |  0  |  0  |  0  |  0  |  0  |  0  |  0  | 

經過v.x.s1=1,v.x.s2 =8;v.x.s3=1;這三個賦值後,就變成了圖2的的那樣了。圖2了,列印出來也看到了。果真是這樣的。

|        s3        |         s2        |        s1         | 

|  9  |  8 |  7  |  6  |  5  |  4  |  3  |  2  |  1  | 

|  0  |  0 |  1  |  0  |  0  |  0  |  0  |  0  |  1  | 

對於這個語句v.s = 0x10a ;的賦值,想看看聯合體中的元素是不是共用一塊記憶體,看到的果然也在意料之內。0x10a的二進位制就是下面的9位所顯示的。列印出來也是意料的那樣。

圖3:|        s3        |         s2        |        s1         | 

|  9  |  8 |  7  |  6  |  5  |  4  |  3  |  2  |  1  | 

|  1  |  0 |  0  |  0  |  0  |  1  |  0  |  1  |  0  | 

最後還列印出來整個字聯合體大小為4,這個是int型決定的位元組數。

5.參考:

C結構體的位域

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

C 結構體中的位域

結構體的儲存方式存在記憶體對齊問題,在本文中不展開討論,本文主要想說明兩個問題,第乙個是位域的賦值問題 還有乙個就是資料的表達形式。好了,現在我們先討論一下位域的賦值問題 現假設有如下結構體 struct byte 首先我們知道,one和two儲存在同乙個位元組中,所以我們本能的以為語句 struc...

C結構體之位域

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