C语言 共用体/联合体 union
生活随笔
收集整理的這篇文章主要介紹了
C语言 共用体/联合体 union
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引入
傳統技術的缺陷—結構體
共用體基本介紹
共用體與結構體一樣都是值傳遞
定義共用體的三種方式
內存布局
共用體數據空間=占用最大的成員的數據空間大小
案例解析
1)
2)
3)
4)
注:
1010 1101 0101 0100所對應的十進制是負數
計算機中的二進制都是以補碼存儲的,所以1010 1101 0101 0100是補碼
計算時,補碼=>反碼=>原碼
補碼=原碼取反+1
所以補碼=>原碼: 補碼-1,再取反
補碼: 1010 1101 0101 0100
補碼-1: 1010 1101 0101 0011
取反: 1101 0010 1010 1100
計算此時得到的原碼:
-(214+212+29+27+25+23+2^2)
=-(16384+4096+512+128+32+8+4)
=-21164
所以輸出原碼:-21164
記住:計算機中存儲的是補碼,輸出的是原碼
正數:原碼=反碼=補碼
案例實踐
兩種定義共用體的方式都可以
代碼
fflush(stdin);//刷新一下輸入,保證數據都存入到結構體中
以表格的形式輸出信息
練習–公司職員信息
#include<stdio.h> #include<string.h> //共用體union--職員信息表格 #define SIZE 100 struct Staff{char name[10];//姓名int age;//年齡char flag;//標識 a輸入公司,b輸入職業union Position{//不能使用char *com; 這里是字符串常量,不能改變char com[10];//公司char pro[10];//職業}pos; }staff[SIZE];//定義結構體數組,存儲多個結構體變量 int main() {int i=0,d=1,j;while(1){printf("input information %d:\n",i);printf("d:\n");scanf("%d",&d);//d=1繼續循環,d=0跳出循環if(d==0)//d=0{break;//跳出while循環}else if(d==1)//d=1{printf("name age flag:\n");scanf("%s %d %c",staff[i].name,&(staff[i].age),&(staff[i].flag));if(staff[i].flag=='a'){printf("com:\n");scanf("%s",staff[i].pos.com);}else if(staff[i].flag=='b'){printf("pro:\n");scanf("%s",staff[i].pos.pro);}}i++;}fflush(stdin);printf("exit:\nprint the information:\n");printf("name\tage\tpos\n");for(j=0;j<i;j++){if(staff[j].flag=='a')printf("%s\t%d\t%s\n",staff[j].name,staff[j].age,staff[j].pos.com);else if(staff[j].flag=='b')printf("%s\t%d\t%s\n",staff[j].name,staff[j].age,staff[j].pos.pro);}getchar();//entergetchar();return 0; }總結
以上是生活随笔為你收集整理的C语言 共用体/联合体 union的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摘帽会涨停吗,要看情况
- 下一篇: C++学习 高级编程