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