學習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"3.得出下面的結果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 ;
}
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語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...