C语言 共用体/联合体 union
引入
傳統(tǒng)技術(shù)的缺陷—結(jié)構(gòu)體
共用體基本介紹
共用體與結(jié)構(gòu)體一樣都是值傳遞
定義共用體的三種方式
內(nèi)存布局
共用體數(shù)據(jù)空間=占用最大的成員的數(shù)據(jù)空間大小
案例解析
1)
2)
3)
4)
注:
1010 1101 0101 0100所對(duì)應(yīng)的十進(jìn)制是負(fù)數(shù)
計(jì)算機(jī)中的二進(jìn)制都是以補(bǔ)碼存儲(chǔ)的,所以1010 1101 0101 0100是補(bǔ)碼
計(jì)算時(shí),補(bǔ)碼=>反碼=>原碼
補(bǔ)碼=原碼取反+1
所以補(bǔ)碼=>原碼: 補(bǔ)碼-1,再取反
補(bǔ)碼: 1010 1101 0101 0100
補(bǔ)碼-1: 1010 1101 0101 0011
取反: 1101 0010 1010 1100
計(jì)算此時(shí)得到的原碼:
-(214+212+29+27+25+23+2^2)
=-(16384+4096+512+128+32+8+4)
=-21164
所以輸出原碼:-21164
記住:計(jì)算機(jī)中存儲(chǔ)的是補(bǔ)碼,輸出的是原碼
正數(shù):原碼=反碼=補(bǔ)碼
案例實(shí)踐
兩種定義共用體的方式都可以
代碼
fflush(stdin);//刷新一下輸入,保證數(shù)據(jù)都存入到結(jié)構(gòu)體中
以表格的形式輸出信息
練習(xí)–公司職員信息
#include<stdio.h> #include<string.h> //共用體union--職員信息表格 #define SIZE 100 struct Staff{char name[10];//姓名int age;//年齡char flag;//標(biāo)識(shí) a輸入公司,b輸入職業(yè)union Position{//不能使用char *com; 這里是字符串常量,不能改變char com[10];//公司char pro[10];//職業(yè)}pos; }staff[SIZE];//定義結(jié)構(gòu)體數(shù)組,存儲(chǔ)多個(gè)結(jié)構(gòu)體變量 int main() {int i=0,d=1,j;while(1){printf("input information %d:\n",i);printf("d:\n");scanf("%d",&d);//d=1繼續(xù)循環(huán),d=0跳出循環(huán)if(d==0)//d=0{break;//跳出while循環(huán)}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; }總結(jié)
以上是生活随笔為你收集整理的C语言 共用体/联合体 union的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摘帽会涨停吗,要看情况
- 下一篇: 深入理解Solidity 二