首页技术c语言共用体union例子?C语言共用体使用方法

c语言共用体union例子?C语言共用体使用方法

编程之家2026-06-27963次浏览

大家好,关于c语言共用体union例子很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于C语言共用体使用方法的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

c语言共用体union例子?C语言共用体使用方法

c语言中的共用体是什么

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:\x0d\x0aunion共用体名\x0d\x0a{成员表列};\x0d\x0a\x0d\x0aunion data\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adoublec;\x0d\x0achard;\x0d\x0a}obj;\x0d\x0a该形式定义了一个共用体数据类型union data,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。\x0d\x0a\x0d\x0aunion data/*共用体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0astruct stud/*结构体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a};\x0d\x0amain()\x0d\x0a{\x0d\x0astruct stud student;\x0d\x0aprintf("%d,%d",sizeof(struct stud),sizeof(union data));\x0d\x0a}\x0d\x0a运行程序输出:\x0d\x0a15,8\x0d\x0a程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。 \x0d\x0a对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。\x0d\x0a\x0d\x0a可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:\x0d\x0aunion data/*共用体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0a其成员引用为:mm.a,mm.b,mm.c,mm.d但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。\x0d\x0a\x0d\x0amain()\x0d\x0a{\x0d\x0aunion data\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0amm.a=6;\x0d\x0aprintf("%d\n",mm.a);\x0d\x0amm.c=67.2;\x0d\x0aprintf("%5.1lf\n", mm.c);\x0d\x0amm.d='W';\x0d\x0amm.b=34.2;\x0d\x0aprintf("%5.1f,%c\n",mm.b,mm.d);\x0d\x0a}\x0d\x0a运行程序输出为:\x0d\x0a6\x0d\x0a6 7.2\x0d\x0a3 4.2,=\x0d\x0a程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“=”。事实上,字符的输出是无法得知的,由写入内存的数据决定。\x0d\x0a例子虽然很简单,但却说明了共用体变量的正确用法。

C语言中共用体的问题

输出123.399963

double类型占8个字节,int类型占4个字节,un_1共用体占8个字节,i成员占用它的前四个字节

执行s1.x=123.4;之后,s1位置内存中存放的值为:

40 5E D9 99 99 99 99 9A(十六进制,左边是高位,右边是低位,你可以查查浮点数是如何表示的,double的前12个二进制位表示阶数,后面的表示尾数)

其中i占用前四个字节(低位的四个字节)即99 99 99 9A这部分

c语言共用体union例子?C语言共用体使用方法

执行s1.i=100;之后,i的位置被修改为100即十六进制的64,s1位置内存变为:

40 5E D9 99 00 00 00 64

这是再把它看做一个double的格式输出就是123.399963

改成s1.x=123.4;printf("%d\n",s1.x);

输出为:-1717986918

由于要求输出一个int,所以printf函数只读取了s1.x的前四个(低位的四个)字节

c语言共用体union例子?C语言共用体使用方法

s1位置的内存为:40 5E D9 99 99 99 99 9A

输出的是99 99 99 9A,按照int类型输出为-1717986918(符号位为1,所以是负的)

同理,改成s1.i=100;printf("%f\n",s1.i);

输出为:0.000000

执行s1.i=100;之后,s1位置的内存为

00 00 00 00 00 00 00 64

按照double类型输出为0.000000

关于c语言共用体的问题

int型的变量占2个字节,而一个内存单元只有一个字节的大小,因此int型变量要分开放。

那怎么放呢?是这样的,先把int变量分成两个字节,前八位作为高字节,后八位作为低字节,这样,把高字节的那八位放在低地址内存单元,低字节的那八位放在高地址内存单元。

而long型的占四个字节,也是一样的,分成四个字节分开放,高字节放低地址内存单元。

你的程序中,只占一个字节的0x39给了int型的i[0],那这样,高字节为0,假设放在最低地址的内存单元中,那0x39就顺着往上放,i[1]也一样。好了,这样放完后,这个占四个字节的共用体变量的存储情况就是:0x38/0x00/0x39/0x00(说明:左手边为高地址,右手边为低地址)。

i[1]i[0]

好了,我们现在是取long型的k,那很显然,低地址的存储单元是它的高字节,高地址的存储单元是它的低字节,这样就得到:0x00390038。

这是我用keil-C51仿真得到的结果,如果你问为什么结果跟你的不一样,那我只能回答:系统决定变量的存放方式。

关于本次c语言共用体union例子和C语言共用体使用方法的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

仙乡的金塔下冥想在哪?仙乡的女人swoole loader swoole websocket