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? 展开
{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? 展开
展开全部
这个是共用体的问题
由于共用体共用同一段起始内存的地址,所以后一次的数据写入可能会覆盖前一次的数据
然后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字节处理的话,同理
由于共用体共用同一段起始内存的地址,所以后一次的数据写入可能会覆盖前一次的数据
然后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
展开全部
#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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |