结构体位域及联合体解析
生活随笔
收集整理的這篇文章主要介紹了
结构体位域及联合体解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于敘述不及代碼演示,直接上代碼;后面敘述下優缺點;
//結構體位域及聯合體解析 //sizeof(s1)等于3。因為一個位域字段必須存儲在其位域類型的一個單元所占空間中,不能橫跨兩個該位域類型的單元。 struct st1 {unsigned char a : 7; /*字段a占用了一個字節的7個bit*/unsigned char b : 2; /*字段b占用了2個bit*/unsigned char c : 7; /*字段c占用了7個bit*/ }s1;//sizeof(s2)等于2。因為a b 位域正好占用一個字節 8bit。因此一共占用兩個字節 struct st2 {unsigned char a : 7; /*字段a占用了一個字節的7個bit*/unsigned char b : 1; /*字段b占用了2個bit*/unsigned char c : 7; /*字段c占用了7個bit*/ }s2;//聯合體和結構體位域聯用 union union_st3 {struct st2 X;unsigned short all; //兩個字節,16bit }union_t3;int main(void) {s1.a = 15;s1.b = 3; //注意賦值不要超限,像s1.b占用2bit 取值范圍:0-3;不然編譯可能會報錯s1.c = 0;printf("sizeof s1.b = %d\r\n",s1.b);union_t3.all = 0xffff;printf("sizeof s1.all = %d\r\n",union_t3.all);printf("sizeof union_t3.X.a = %d\r\n",union_t3.X.a);printf("sizeof union_t3.X.b = %d\r\n",union_t3.X.b);printf("sizeof union_t3.X.c = %d\r\n",union_t3.X.c);union_t3.all = 0x0f87;//0[000 1111] [1][000 0111] c:15 b:1 a:7printf("sizeof s1.all = %d\r\n",union_t3.all);printf("sizeof union_t3.X.a = %d\r\n",union_t3.X.a);printf("sizeof union_t3.X.b = %d\r\n",union_t3.X.b);printf("sizeof union_t3.X.c = %d\r\n",union_t3.X.c);printf("sizeof s1 = %d\r\n",sizeof(struct st1));printf("sizeof s2 = %d\r\n",sizeof(struct st2)); } //執行結果:自己對照下打印順序sizeof s1.b = 3 sizeof s1.all = 65535 sizeof union_t3.X.a = 127 sizeof union_t3.X.b = 1 sizeof union_t3.X.c = 127 sizeof s1.all = 3975 sizeof union_t3.X.a = 7 sizeof union_t3.X.b = 1 sizeof union_t3.X.c = 15 sizeof s1 = 3 sizeof s2 = 2- 優點:可以把一個變量拆分成位域,省時省空間,再結合聯合體,完美;
- 缺點:不同系統對位域的處理可能有不同的結果,如位段成員在內存中是從左向右分配的還是從右向左分配的,所以位域的使用不利于程序的可移植性。
總結
以上是生活随笔為你收集整理的结构体位域及联合体解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符之间或者结构体之间比较
- 下一篇: 二级指针示例