联合体的存储
unionA{.......}内的成员,公用一个存储单元.
unionAa;占一个存储单元
unionAb;占一个存储单元
共占两个存储单元.
至于union嵌套,依然遵循以上原则.联合体内成员公用一个存储单元.
unionAAA{
inta;
unionBBB{
double_a;
char_b;
}b;
}c;
BBB中包含_a 和 _b ,公用一个存储单元, b占内存大小为double大小
AAA中包含a 和 b , 公用一个存储单元 , c占用内存大小为b的大小.
❷ c语言联合体内存计算
你的意图我不是很明白,就说说我知道的地方吧,
联合体就是你声明的所有变量他们的起始地址是相同的。换句话说他们公用一块地址。所以整个联合体的大小取决于内部变量占用空间最大的。
看看你联合体内的成员 a占4字节 b[9] 占9个字节 c占8个字节,所以按照最大的计算,联合体啊占大小9个字节,但是他还要满足第二个条件,就是大小必须是内部成员基础类型的整数倍。你的基础类型是int 4字节 char 1字节 double 8字节 取公因数并且要比9大所以他的大小事16个字节。
第二个问题,你直接为一个该结构体的指针赋值(这种做法很危险,因为你不知道指向的空间具体是什么内容),所以 pp 就指向了一个空间,然后 qq=pp+0x10 这里你要注意,并不是简单地pp的地址值上加上0x10编译器对这里的理解是 现在眼前有很多的该结构体类型,他们紧密排列,如果pp的编号是1 那么qq的编号是1+0x10 所以说qq的实际指向地址 是 0x100000(pp的地址)+sizeof(dt)(每个结构体的大小)*0x10 注意结构体大小是16 是十进制 转换成16进制也就是0x10 结果正好是0x100100了
所以最后的输出就是输出他们指向的地址值。
❸ 在C++中联合体有什么好处联合体的内存是怎么分配的,有没有对齐如果有对齐就很浪费空间,怎么还要用到
联合体变量所占内存长度是各最长的成员占的内存长度。 而结构体变量时各个成员所占的内存长度的总和。所以联合体的有点之一是所占内存比结构体少。
联合体每次只能存放哪个的一种。联合体变量中起作用的成员是尊后一次存放的成员, 在存入新的成员后原有的成员失去了作用!
共用体 构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)
结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型。
❹ C语言联合体存储方法
这个和体系结构有关。首先int行具体是1个字节还是2个字节是不确定的。早期的编译器来说。int是一字节。但是现在的都是2字节。因为计算机处理器一般都是32位处理器。
联合只取最大的空间。比如。你定义的联合体。int
A,char
B[2],其实在计算机里面只占用了2个字节。你存储char时,全占了。当你存储为int类型时候。要么占用一半的空间。要么全部都占用了。这个和计算机体系结构有关。但是a和b是不会同时存在的。联合中的成员同时只能有一个。这个是和结构体区别的地方。如果还有疑问建议你去看看书吧。这个是基础知识。
❺ C语言联合体成员在内存中的具体存储方法在线求解…
放12还是34和硬件有关,没用到的两个字节是随机的,也就是说机器只会把相应的存储位置进行处理。
❻ C语言联合体存储方法
这个和体系结构有关。首先int行具体是1个字节还是2个字节是不确定的。早期的编译器来说。int是一字节。但是现在的都是2字节。因为计算机处理器一般都是32位处理器。
联合只取最大的空间。比如。你定义的联合体。int A,char B[2],其实在计算机里面只占用了2个字节。你存储char时,全占了。当你存储为int类型时候。要么占用一半的空间。要么全部都占用了。这个和计算机体系结构有关。但是a和b是不会同时存在的。联合中的成员同时只能有一个。这个是和结构体区别的地方。如果还有疑问建议你去看看书吧。这个是基础知识。
❼ 帮忙看下这道联合体的题目,高分去详解
一、联合体的大小
printf("sizeof(cif)=%d\n" , sizeof(cif) ); //加此语句调试,可以看到其值为4(BYTES),即在内存中,给cif这个变量会分配四个字节的空间。
二、联合体数据cif的存储
字节1 字节2 字节3 字节4
(char 只占字节4,int 和float占四个字节 )
三、符点型数据的存放格式(IEEE754)
符号位1 (s,0为正数,1为负数)+ 指数位8(E--移码e表示) + 小数位23(f) 可表示的规格数为:1.f * 2^E,除去2的N次方的数外,符点型数据全是近似值。因为非2的倍数的小数转为二进制时,不能表示完全。E=e-2^7+1 (关于符点数部分知识请查询相关资料)
现在解释你的结果:
(1)
cif.f=101.1;
printf("c=%c;f=%f\n",cif.c,cif.f);
101.1在内存中的存储为:0 10000101 10010100011001100110011(1.10010100011...*2^6)
根据前面的介绍,最后八位是c值=00110011=0x33='3'
f=1.10010100011...*2^6=101.099998 这是个近似数
(2)
0x2341在内存中的存储为00000000 00000000 00100011 01000001 ,转换成10进制就是9025
计算机解释为符点数约为0,所以,输出0.000000,如果定义输出精度大些时,可以看出不是纯0,如:printf("c=%c,i=%d,f=%.60f",cif.c,cif.i,cif.f); c=A,i=9025,f=0.
最后八位是c值=01000001=0x41='A'
❽ 关于c语言中联合体/共用体中数据存放的问题
你好!!!
首先我们了解联合体的所有成员是在内存中共享一块内存的,在某一时刻只能有一个成员使用这个内存!!!
我们来看看一个例子:
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266
解释如下:
union
{
int i;
char x[2];
}a;
在联合体a中定义了两种数据类型,字符数组x以及整形变量i.其中整形变量是16位的,数组大小为2的字符数组为8X2=16位。如此一来,编译器便会为联合体a在内存中开辟一个16位的空间,这个空间里存储联合体的数据,但是这个空间只有16位,它既是整形变量的数据,也是字符数组的数据。如果你的程序从字符数组的角度解析这个空间,那么它就是两个字符,如果你的程序从整型的角度解析这个空间,那么它就是一个整数。
以你的程序为例子,现在已经开辟了一个16位的空间,然后我们假定现在空间还没有被赋值,为:
00000000 00000000
那么在运行完代码
a.x[0] = 10;
a.x[1] = 1;
之后,16位的空间变为:
00001010 00000001
然后程序运行
printf("%d",a.i);
就是把联合体a当成一个整数来解析,而不是字符串数组。那么这样一来,程序就把这16位变成了一个完整的整数:
(00000001 00001010)二进制 = (266)十进制
注意,你可以看到程序在把16位弄成整数的时候把后面八位放在了前面,前面八位放在了后面。这个反序是计算机存储结构造成的,这个和联合体没有直接关系。如果感兴趣的话可以参考汇编语言。
现在我们来看看,你给的例子:
union dt
{
int a;
char b;
double c;
}data;
此时的联合体所占的内存大小是8个字节,接下来执行:
data.a=5;
此此时内存中就不是空的了,也就不会是你说的是随机数,
但是输出:printf("%lf",data.c);结果是0.000000,这个结果我还不能给你准确的解释。但是我可以肯定这与系统把double转换成int 和int 转化成 double 有关!!!
暂时我只能解释这那多!!!
❾ c语言:判断联合体中存储的数据的类型
structexample
{
enum{
chaos,//没有初始化,错误的状态
int_t,//存的是int
chars_t,//存的是char
}type;
union{
inta;
charb[50];
};
}flag[10];
每次修改的时候手动设置type的值,没有别的办法
❿ 联合体存储
联合体结构采用最大数据占用长度存储数值,
就 union dt data;
int,char, double 最大占用长度为double ,占4个字节,其存储方式是按低位存储;
因此 data.a=5;
data.c 也是 5 ,由于是double类型,因此输出是5.00000;
data.b 也是 5 ,由于是char类型,因此输出是ascii码值为5的那个字符。