㈠ 关于c语言联合体的问题
在VC6.0下运行,输出的是266。
我觉得是这样的:
union是所有的变量共用同一块内存。其大小就是其包含的变量中最大的数据类型。
本题中应该是4B,也就是int的大小。
当执行a.x[0] = 10; a.x[1] = 1;时,存储形式是000100001010(其长度应该是32,省略前面的0)
其中的0001就是a.x[0]中的十位数字1,一次类推。
当你输出a.i时,程序就把000100001010当成int型输出。
二进制的0000100001010就是266。
这是我根据答案推测的,不知道对不对。
㈡ c语言联合体
union 在这个程序中取四个字节
对:
s->i[0]=0x39;取前两个字节存储
s->i[1]=0x38;取后两个字节存储
而:
printf("%c\n",s->c[0]);则是取 “s->i[0]=0x39;取前两个字节存储” 中的前一个字节,又因为0X39的十进制为57(一个字节最大数64),输出的9的ascii码正好小于64,所以输出的数正好是9.
㈢ 关于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语言有关共用体的使用方法,请前辈们请教谢谢啦!
共用体又称联合体,关键字union,正如其名字,其成员变量共同占用同一段内存,这段内存的大小就是所有成员中最大的那个,所以整个共用体变量大小就是其最大成员大小,比如你代码中的A大小就是成员c的大小8个字节。
至于用处还是有很多的:
比如我们表示一个学生分数,有幼儿,小学,初中,这三种学生信息结构基本相同,但只有分数标准不一样,幼儿分数(差、中、优),小学(C、B、A),初中(0~100分)。那么我们就可以把学生信息定义成结构体,而结构成员分数那一块定义成共用体(包含字符串类型,字符类型、数值类型)。这样结构本身就不需要定义三种类型成员了。
又比如,数据传递时,用共用体表示数据,之后只要按照你的需求按不同格式获取数据。
㈤ C语言联合体存储方法
这个和体系结构有关。首先int行具体是1个字节还是2个字节是不确定的。早期的编译器来说。int是一字节。但是现在的都是2字节。因为计算机处理器一般都是32位处理器。
联合只取最大的空间。比如。你定义的联合体。int
A,char
B[2],其实在计算机里面只占用了2个字节。你存储char时,全占了。当你存储为int类型时候。要么占用一半的空间。要么全部都占用了。这个和计算机体系结构有关。但是a和b是不会同时存在的。联合中的成员同时只能有一个。这个是和结构体区别的地方。如果还有疑问建议你去看看书吧。这个是基础知识。
㈥ C语言的联合体问题
union
{
int i;
struct
{
char first;
char second;
}half;
}number;
这里面相当于两个元素,一个元素int 占四个字节(早期是两个字节)
一个元素是结构体类型的占有两个字节其中低八位是char first 高八位为char second;
这两个元素公用一段内存空间,当你把i = 0x4241的时候i的内存表示形式为0x4241高八位为0x42而低八位为0x41而正好大写字母A的ascall 值为0x41 而B为0x42
后面的也就类似这样解释。
楼主你其实可以把上面的
number.half.first='a';
number.half.second='b';试着只用一行语句而不两行同时使用的结果。
比如把上面number.half.first='a'; 注释掉,结果就变成了高八位为0x62 而低八位还是0x41
所以结果输出就会改变为6241
㈦ c语言 联合体问题
什么数组啊!
人家是联合体,是C里面的一种数据类型
楼主,我个人认为,你这样的用法是错误的。
虽然F9的时候没有报错
但我从来没有见过有这么用(也可能是我忘了或本来就见识短)
#include
<stdio.h>
main(){
union{
int
a;
float
b;
char
c;
}x;
x.a=5;
printf("\n%d",x.a);
x.b=105.005;
printf("\n%f",x.b);
x.c='a';
printf("\n%c",x.c);
}
/******原来楼下的****/
由于在联合体中的各变量内存地址相同,大小为最大的最大类型的长度。初始化5的数据直接储存与该地址出,按照取值类型进行处理。然而,数据放入内存中的地址是低字节在前面,而高字节在后面,所有printf("\n%d",x.c);也输出5,如果你使用超过一个字节的数,如258,即
union{
int
a;
float
b;
char
c;
}x;
x.a=258;
printf("\n%d",x.c);
看看,结果就不一致了。
在存放数据的时候是按union里定义的数据类型存放的,读取的时候也是按union里定义的类型进行读取的,但输出的表示形式却是由printf("\n%d",x.c);
中的(%d)控制的。我们知道char类型的数据只占一个字节,所以读出时也只读一个字节的长度,当所放的数据大于一个字节的时候它会舍去一个字节的数据,在用%d输出的时候就会比你原来的int型数据要小256(一个字节能表示的最大整数)——这就是结果不一至的原因。
还有一个值得重视的是,
x.b=105.005;
printf("\n%f",x.b);
x.c=25;
printf("\n%d",x.a);
和
x.b=1305.005;
printf("\n%f",x.b);
x.c=25;
printf("\n%d",x.a);
执行后printf("\n%d",x.a);
的结果是不一样的。原因是我前面已经说过了“在存放数据的时候是按union里定义的数据类型存放的”(但它并不覆盖原先已经存放过数据的整个union数据区),而读取的时候还是按union里定义的类型进行读取的,但输出的表示形式却是仍由printf("\n%d",x.c);
中的(%d)控制的。
上面我们虽然x.c都是25,但读取的时候,是按union中x.a的数据类型(int型)读出的,这时实际读出的类型就比x.c的char型数据要多了,多出来的数据就来至x.b在内存中残留的数据。
㈧ c语言中联合体有什么用
其实联合体也没什么用,你只要把结构体学好就行了,大部分还是用到结构体,而且联合体和结构体差不多。
㈨ 在c语言中,共用体一般有什么作用
共用体一般指联合体,作用如下:
1、节省内存
有两个很长的数据结构,不会同时使用,用结构体的话,只占用最长的那个数据结构所占用的空间,就足够了。
2、做某些转换用
union{char a[8];double x;};
x=20.8;
cout<<hex<<a[0]<<“ ”<<a[1]<<…<<endl;
(9)c语言联合体的使用扩展阅读:
结构体和共用体
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。
共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
共用体也是一种自定义类型,可以通过它来创建变量,
㈩ C语言联合体
为什么选A呢?union数据类型里的每一个变量共用一段内存,union长度和最长的变量一致;所以变量c的值和a[0]的低8位是一样的(为啥是低8位?这和数据在内存中的组织形式有关),应该选B