c语言共用体输出问题

union{inta[2];longb;charc[4];}s;s.a[0]=0x39;s.a[1]=0x38;printf("%lx\n",s.b);printf("%... union
{int a[2];long b;char c[4];}s;
s.a[0]=0x39;
s.a[1]=0x38;
printf("%lx\n",s.b);
printf("%c\n",s.c[0]);
结果为什么是380039和9?
展开
 我来答
shine1991
科技发烧友

推荐于2018-04-12 · 智能家居/数码/手机/智能家电产品都懂点
知道顶级答主
回答量:4.7万
采纳率:82%
帮助的人:2.3亿
展开全部
这个是共用体的问题
由于共用体共用同一段起始内存的地址,所以后一次的数据写入可能会覆盖前一次的数据
然后lz这道题,如果系统将int做2直接处理(比如TC2)的话,结果是380039和9;如果是按4字节处理的话,结果应该是39和9

下面针对lz的结果,讲一下2字节处理的情况
第一个共用体成员是int的数组,两个元素,共4字节
第二个成员是long,4字节
第三个成员是char数组,4个元素,4字节
所以这个union变量共4字节
s.a[0]=0x39;
s.a[1]=0x38;
导致变量s的内存存储的16进制数据(小尾存储的话)高位到低位依次为为
00 38 00 39
所以才会导致输出380039和9

4字节处理的话,同理
追问
谢谢,还有两个地方没看懂:
(1)s的内存存储不应该是00390038吗?为什么是00380039?
(2)c[0]应该占一个字节,而9只有半个字节,为什么是9?
追答
什么叫“小尾存储”什么叫“大尾存储”( big-endian   little-endian)
好好查一下就知道了,不解释

9这里是字符9,‘9’,不是数字9
‘9’的ASCII码的16进制表示就是39
ge2008ge12
2011-11-14 · TA获得超过1110个赞
知道小有建树答主
回答量:683
采纳率:100%
帮助的人:338万
展开全部
#include<stdio.h>
union
{
int a[2];
long b;
char c[4];
}s;
int main()
{
s.a[0]=0x39;
s.a[1]=0x38;
printf("%lx\n",s.b);
printf("%c\n",s.c[0]);
return 0;
}////
///联合体又称共用体,内存的最大空间是最大变量所占的空间long 和int均占四个字节int a[2]占8个字节

//s.a[0]=0x39;///整个占的空间应该是0x0039
//s.a[1]=0x38;///整个占的空间应该是0x0038
//printf("%lx\n",s.b);的时候是s.a[0]内存中的内容0x0039,因为是"%lx这种显示方式所以为39
// printf("%c\n",s.c[0]);的时候是s.a[0]内存低地址一个字节中的内容9 故显示9
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
949329149
2011-11-20
知道答主
回答量:32
采纳率:0%
帮助的人:10万
展开全部
!!!!!!!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式