C语言共用体问题~~

C语言共用体问题~~,第1张

其实union表示里面的三个变量公用一块内存,这里最大的是int(和float一样大),即4个字节,也就是说三个变量公用4个字节,所以最后一次赋值ai=0x2341;会使得最终着4个字节的值为0x00002341,而char c取得是最有一个字节,即十六进制的41,对应字符就是'A', 而int当然取得就是十六进制的0x2341,转换为10进制就是9025了,对于float,它对应的二进制如下:0 00000000 00000000010001101000001,详细的自己查标准吧。

共用体跟结构体不同,这些变量同享一段内存空间,将16991存入a变量中以int型输出,可以得到它本身,将它转化成二进制,输出字符型变量时,只取最后的八位转化成十进制正好是是65,输出A。下一个输出应该也是这样算。

16961化成二进制为:0100001001000001,取后八位01000001化为十进制65,c[0]就是这八位,是A

而c[1]是前八位01000010,为66也就是B

这个是共用体的问题

由于共用体共用同一段起始内存的地址,所以后一次的数据写入可能会覆盖前一次的数据

然后lz这道题,如果系统将int做2直接处理(比如TC2)的话,结果是380039和9;如果是按4字节处理的话,结果应该是39和9

下面针对lz的结果,讲一下2字节处理的情况

第一个共用体成员是int的数组,两个元素,共4字节

第二个成员是long,4字节

第三个成员是char数组,4个元素,4字节

所以这个union变量共4字节

sa[0]=0x39;

sa[1]=0x38;

导致变量s的内存存储的16进制数据(小尾存储的话)高位到低位依次为为

00 38 00 39

所以才会导致输出380039和9

4字节处理的话,同理

如果你没有打错的话,你的教材印错了

printf("%x\n", s->C[0]);

上面的下标不是10,应该是0

这样的话答案才是39

其实这道题偏难,解释一下:

结构体根据最长的成员分配空间,所有成员共享空间,就是说他们在内存中的地址相同。

所以题中的结构体在内存中的长度是8(就是第一个成员int数组的长度,因为它最长),long型的k占4个字节,char数组占4个字节。

然后有必要解释一下x86指令体系下的内存特性,数组在内存中存放时,按字节为单位,低字节的在低地址,高字节在高地址。举个例子:比如对于int i=4;实际占用4个字节(vc中),就是0x00000004,最低位的字节为0x04,在内存中存放顺序(内存地址由低到高)为0x04 0x00 0x00 0x00。

题中给数组i的两个元素分别赋值为0x39和0x38,他们在内存中的分布是这样的(内存地址由低到高):0x39 0x00 0x00 0x00 0x38 0x00 0x00 0x00,所以char数组C的4个元素分别为0x39,0x00,0x00,0x00。16进制方式打印C[0]就是39。

因为union中,变量时共享内存空间的

这样一来,t赋值-7的话,实际上是这整段空间被作为一个int型变量进行赋值,对于负整数来说,在内存中以补码形式存放,-7的补码就是1111 1111 1111 1111 1111 1111 1111 1001,而同时,内存中是按照低位存放低位、高位存放高位的形式存放的,也就是说,实际上a[1]所在的内存区域的内容是全部为1,全部为1的数是-1的补码,所以a[1]=-1

结果 是16

共用体的话。。。占用的空间是最大的那一个。。。

long x[2]; 占8字节

int y[4]; 占16字节

char z[8];占8字节

所以结果是8。。。。。。

共用体的意思就是不同的变量占用相同的空间。。。所以所用的空间就是变量中所需要的最大的那个空间。。

希望对你有帮助。。。仍有问题可以HI我。 。。。

以上就是关于C语言共用体问题~~全部的内容,包括:C语言共用体问题~~、C语言共用体的问题、c语言共用体输出问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10136999.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存