永发信息网

关于union的C语言题目:写出下面程序正确的输出结果。谢谢了!

答案:2  悬赏:10  手机版
解决时间 2021-04-01 23:56
关于union的C语言题目:写出下面程序正确的输出结果。谢谢了!
最佳答案
首先 union 和 struct 不同的一点就是一个 Union 中的所有成员都是共用一个内存空间的,大小由成员中要求空间最大的来决定。也就是说你给其中一个成员赋值以后,其他成员就都是这个值,只不过因为成员类型不同导致这个值的表现不同。现在看这个程序,定义了一个 union
union {
    int i[2];
    long k;
    char c[4];
} t;所有成员的大小分别如下:
i: 2 * sizeof(int) = 2 * 4 = 8
k: sizeof(long) = 4
c: 4 * sizeof(char) = 4 * 1 = 4可见最大的是那个整数数组 i,占 8 个字节,所以这个 union t 的大小就是 8。
然后,你通过
s->i[0] = 0x39; 
s->i[1] = 0x38;给 i 数组赋值,也就是 i 的前四个字节存储的是十六进制整数 0×39,后四个字节存储的是十六进制整数 0×38。因为 union 的所有成员共享一个内存空间,所以 k 和 c 的值同 i 的值是一样的。然而 k 和 c 只有四个字节的长度,所以后面的 0×38 就被忽略了,因为 0×39 已经占据了前 4 个字节。也就是说,现在 k 的值是 0×39,c 的值也是 0×39。
然后看你的输出
printf("%1x
", s->k);                                     
printf("%c
", s->c[0]);你要将 k 以十六进制整数的方式输出到屏幕上,c 以字符的方式输出到屏幕上,也就是将 0×39 分别以十六进制整数和字符的方式输出到屏幕上。0×39 代表的十六进制整数当然还是 39,而 0×39 所代表的字符是 '9'(注意这个 9 是字符而不是整数),这个你可以查一下 ASCII 表看看十六进制的 39 对应的字符是不是 '9'。所以输出的结果自然就是 39 和 9 了。
下图为 ASCII 表的一部分,可见十进制的 57,也就是十六进制的 39 所代表的字符是 '9'。



为了更好理解 union,你也可以使用
printf("%c
", s->c[4]);打印出来 c[4],看看结果是不是 '8'。这是因为虽然定义 c 的长度是 4,但由于整个 union 在内存中的长度有 8,所以 c[4] 到 c[7] 这四个字节在内存中仍然是存在的,而它的值就是刚才存在 i 中的第二个整数 0×38。然后因为十六进制的 38 对应的字符是 '8'(见上图),所以打印出 c[4] 的值是 8。



一点题外话是,包含系统头文件时请使用
#include 而不是

#include "stdio.h"这样会稍微提高执行效率。还有就是请让 main 函数返回整数 0 而不是 void,返回 void 是不规范的写法。

全部回答

int和long一样都是4个字节,所以s->k取的就是i[0]的值。
 printf("%c ",s->c[0]) 算出是9和大小端有关,只有小端才是9。就是ANSI char '9',换成十六进制就是39。char[0]取了i[0]的低八位。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
语文比较薄弱 怎么办?
紫砂之家与紫砂印象有啥区别
土地黄别名是
100m的宽带为什么网速还是很慢
命中带神煞是神鬼不侵吗 算八字硬吗 本人1991
p2p理财平台,在315这个消费权益日也有活动吗
怡保白咖啡在哪看生产日期
波兰十月事件的介绍
无堵塞排污泵有什么用?
康佳液晶40寸网络LED电视怎么下软件
请教一个问题,有人说2K16的难度不影响投篮
马上就31岁了,什么时候能嫁出去
鲁达与林冲如何走在一起的
11-5=6 11-6=5的规律
我费劲九牛二虎之力中午把女朋友带进酒店,我
推荐资讯
快递怎么邮便宜
黑暗之魂3最新版本是多少
报关时两票货按一票货报关的情况下对退税有影
水管明装好还是暗装好?有什么区别?
08款奥德赛进排气门有分吗?
零下14度对钢琴有什么影响?
好学上进的读音
在兵工七子里面,中北大学和沈阳理工大学哪所
梅西有多高?
晚上打鸟用的灯是什么灯
华谊总部地址
天猫总销量是多久的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?