引入
傳統技術的缺陷—結構體
共用體基本介紹
共用體與結構體一樣都是值傳遞
定義共用體的三種方式
內存布局
共用體數據空間=占用最大的成員的數據空間大小
案例解析
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;
}