姓名 郭宇
學號 16130130299
轉載自【C語言編程之位結構】
http://m.toutiaocdn.cn/group/6488652660613317133/?iid=17602826099&app=news_article&tt_from=android_share&utm_medium=toutiao_android&utm_campaign=client_share
【嵌牛導讀】:c語言 位域結構體
【嵌牛鼻子】 編程 ? c語言
【嵌牛提問】怎樣定義位域結構體 及它的用途
【嵌牛正文】:
【C語位結構是一種特殊的結構, 在需按位訪問一個字節或字的多個位時, 位結構比按位運算符更加方便。位結構定義的一般形式為:
struct位結構名{
數據類型 變量名: 整型常數;
數據類型 變量名: 整型常數;
} 位結構變量;
其中: 數據類型必須是char或16位int(unsigned或signed)。 整型常數必須是非負的整數, 范圍是0~15, 表示二進制位的個數, 即表示有多少位。變量名是選擇項, 可以不命名, 這樣規定是為了排列需要。
例如: 下面定義了一個位結構。
struct{
unsigned incon: 8; /*incon占用低字節的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字節的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字節的4~6位共3位*/
unsigned blink: 1; /*blink占用高字節的第7位*/
}ch;
位結構成員的訪問與結構成員的訪問相同。
例如: 訪問上例位結構中的bgcolor成員可寫成:
ch.bgcolor
注意:
1. 位結構中的成員可以定義為unsigned, 也可定義為signed, 但當成員長度為1時, 會被認為是unsigned類型。因為單個位不可能具有符號。
2. 位結構中的成員不能使用數組和指針, 但位結構變量可以是數組和指針, 如果是指針, 其成員訪問方式同結構指針。
3. 位結構總長度(位數), 是各個位成員定義的位數之和, 可以超過兩個字節。
4. 位結構成員可以與其它結構成員一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;’
上例的結構定義了關于一個工從的信息。其中有兩個位結構成員, 每個位結構成員只有一位, 因此只占一個字節但保存了兩個信息, 該字節中第一位表示工人的狀態, 第二位表示工資是否已發放。由此可見使用位結構可以節省存貯空間。
問題的解答
結構struct x,有三個成員s1,s2,s3每一個成員占3 bit,結構與char c union ;
char 一般機器占一個字節(8 bit ,100 二進制值為:01100100,所以s1后三bit(6,7,8 bit) :100,s2為中間三位(3,4,5 bit)為100 s3為01,所以printf(”%d/n”,v.x.s3)是1,其它是4。現在大多數系統都是將低字位放在前面,而結構體中位域的申明一般是先聲明高位。
100 的二進制是 001 100 100
低位在前 高位在后
001—-s3
100—-s2
100—-s1
所以結果應該是 1
如果先申明的在低位則:
001—-s1
100—-s2
100—-s3
結果是 4
其中unsigned short s1:3; 中的“:”又是什么意思?
指定位段, 3代表預定s1占3bit.
為什么是4?
struct
{
unsigned short s1:3; //一個字節. 雖然預定為3bit,但系統的存儲空間為至少一字節.
unsigned short s2:3; //一個字節
unsigned short s3:3; //一個字節
}x;
這樣在聯合union中最大的成員為三個字節,而最終結果為了內存對齊(對齊為4的倍數).取為4
位結構在DSP、MCU等嵌入式中廣泛應用