㈠ 在c语言中,共用体一般有什么作用
所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:
union 共用体名
{成员表列};
union data
{
int a ;
float b;
doublec;
chard;
}obj;
该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。
union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*结构体* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
运行程序输出:
15,8
程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。
对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。
可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:
union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
其成员引用为:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。
main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
运行程序输出为:
6
6 7.2
3 4.2,=
程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决定。
例子虽然很简单,但却说明了共用体变量的正确用法。
㈡ c语言中uint是什么意思
c语言中uint是“共用体”类型结构,简称共用体,也叫联合体。
在结构中各成员有各自的内存空间,一个结构体变量的总长度大于等于各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。
共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
(2)c语言共用体类型扩展阅读
uint是占2字节,uchar占1字节,uchar声明的变量能存的字节数肯定比uint少。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据。
比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。
㈢ C语言设计 共用体 类型的本意和现在的主要应用
所谓共同体就是英文直译就是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值。
设有一个教师与学生通用的表格,教师数据有姓名,年龄,职业,教研室四项。学生有姓名,年龄,职业,班级四项。
编程输入人员数据, 再以表格输出。
程序用一个结构数组body来存放人员数据, 该结构共有四个成员。其中成员项depa是一个联合类型, 这个联合又由两个成员组成,一个为整型量class,一个为字符数组office。在程序的第一个for语句中,输入人员的各项数据,先输入结构的前三个成员name,age和job,然后判别job成员项,如为"s"则对联合depa·class输入(对学生赋班级编号)否则对depa·office输入(对教师赋教研组名)。
在用scanf语句输入时要注意,凡为数组类型的成员,无论是结构成员还是联合成员,在该项前不能再加"&"运算符。如程序第18行中
body[i].name是一个数组类型,第22行中的body[i].depa.office也是数组类型,因此在这两项之间不能加"&"运算符。程序中的第二个for语句用于输出各成员项的值:
int main()
{
struct
{
char name[10];
int age;
char job;
union
{
int class;
char office[10];
} depa;
}body[2];
int n,i;
for(i=0;i<2;i++)
{
printf("input name,age,job and department\n");
scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);
if(body[i].job=='s')
scanf("%d",&body[i].depa.class);
else
scanf("%s",body[i].depa.office);
}
printf("name\tage job class/office\n");
for(i=0;i<2;i++)
{
if(body[i].job=='s')
printf("%s\t%3d %3c %d\n",body[i].name,body[i].age
,body[i].job,body[i].depa.class);
else
printf("%s\t%3d %3c %s\n",body[i].name,body[i].age,
body[i].job,body[i].depa.office);
}
}
㈣ C语言关于共用体类型的问题
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
很显然,在上面这种情况下,除了最后7位全部是0,E也全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。而%f只能打印出小数点后第六位,所以显示的全部是0
如果再往后表示127位小数点,或者用科学计数法表示,可以看到是会有值的。只是他太小了。
书上的说的数值部分全部是0是不对的,数值部分后52位是有值的,只是乘上E-127以后太小了,可以忽略不计
㈤ c语言共用体类型
#include<stdio.h>
#include<stdlib.h>
struct
{
intnum;
charname[10];
charjob;
union
{
intclas;
charposi[10];
}cate;
}p[2];
intmain()
{
inti;
for(i=0;i<2;i++)
{
scanf("%d%c%s",&p[i].num,&p[i].job,p[i].name);//p[i].name已经是地址了,不需要&符号了
if(p[i].job=='s')
scanf("%d",&p[i].cate.clas);
elseif(p[i].job=='t')
scanf("%s",p[i].cate.posi);
elseprintf("inputerror!");
}
printf(" ");
for(i=0;i<2;i++)
if(p[i].job=='s')
printf("%d%s%c%d ",p[i].num,p[i].name,p[i].job,p[i].cate.clas);//class是unioncate的变量,当然p[i].clas是错误的了,况且上面的if语句不都是写的p[i].cate.clas吗
else
printf("%d%s%c%s ",p[i].num,p[i].name,p[i].job,p[i].cate.posi);//同上,并且p[i].cate.posi是char*类型,应该用%s而不是%c
system("pause");
return0;
}
㈥ c语言中共用体类型
共用体类型是union
㈦ c语言里,怎样判断共用体union的数据类型
我刚好也在考虑此问题,答案给各位补充完整:
ps:<C语言程序设计现代方法第二版>,该书明确说明。要判断设置的是什么类型的值只有增加标识。
可以这样设计数据结构:
structmydata{
intsetflag;
union{
intstate;
char*msg;
}data;
};
mydata 自己设计得数据类型,setflag 标识设置的是哪个成员,从上到下可以从union的第一个成员开始:
如果第一个成员被设置,则setflag的最低位置1,其他位清零;
如果第二个成员被设置则,则setflag的倒数第二位置1,其他位清零;
以此类推,int一般是32位的,union最多可以有32个成员,成员多了可以再扩展标识变量(比如使用64位的long long 类型)。
然后写一套操作函数:初始化mydata,设置成员值,获取当前设置的成员值(可返回具体类型,union的每个成员需要对应一个get),判断当前某个成员被设置,判断当前是否设置过成员值。
自己实现的一套访问函数签名,如下:
//不知道编译器会在setflag中放啥值,这个函数用来把setflag初始化为0
voidinitiate(structmydata*ptrdata);
//设置值得时候同时设置标识位
voidset(constvoid*ptrval,intbit);
//成功返回0,失败返回-1,ptrintval指向预先分配的int地址空间
intgetstate(int*constptrintval);
//成功返回指向msg的指针,失败返回NULL
char*getmsg();
//判断当前设置的是哪个成员变量,取值1到32。如果给定的位被设置返回1,否则返回0
intissetmember(intflag);
//判断当前是否设置过成员,setflag=0说明没有设置过返回0,否则设置过返回1
intisset();
//initiate必须先调用,否则后面的判断会有问题。弄得有点像C++或java的类了。
㈧ c语言中的共用体
我测试了一下
int为32bit
,long为32位
,char为8位机测试。
分析得出这样的结果:
这正如共用结构体中
假如他们的共用首地址为0x10000000
那么
地址
变量
0x10000000:
a[0]
如果执行语句
s.a[0]=0x39
0x10000004:
a[1]
相差4个字节
那么会产生如下变化:
0x10000000:
b
a[0]=0x39
b[0]=0x39
c[0]=0x39(
字符c[0]="9")
0x10000000:
c[0]
如果再执行语句
s.a[1]=0x38
0x10000001:
c[1]
那么会产生如下变化:
0x10000002:
c[2]
a[1]=0x38
0x10000003:
c[3]
相差1个字节
也即是地址0x10000000到0x10000003中的数据为0x00000039
也即是地址0x10000004到0x10000007中的数据为0x00000038
虽然是共用体,但是a
b
c同用了一个地址
如果对a赋值了也同时对b和c赋值
只是数据类型不同而已。
如果从地址上来分析
c如果定义的是c[8],那么c[5]地址即为0x10000004
它的值就因该为0x38,因为和a[1]的地址相同。
查看b的是后可以直接用%d来查看
因为在本机上也是32bit和int相同
㈨ 在c语言中,共用体一般有什么作用
共用体一般指联合体,作用如下:
1、节省内存
有两个很长的数据结构,不会同时使用,用结构体的话,只占用最长的那个数据结构所占用的空间,就足够了。
2、做某些转换用
union{char a[8];double x;};
x=20.8;
cout<<hex<<a[0]<<“ ”<<a[1]<<…<<endl;
(9)c语言共用体类型扩展阅读:
结构体和共用体
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。
共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
共用体也是一种自定义类型,可以通过它来创建变量,