c語言編程

姓名 郭宇

學號 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等嵌入式中廣泛應用

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容