问个关于共用体的题目.(计算机2级的)

Squall1009 2004-09-11 10:36:45
#include<stdio.h>
union
{
int a[2];
char c[4];
}x;
main()
{
x.a[0]=0x39;
x.a[1]=0x38;
printf("%c",x.c[0]);
}
计算机2级在dos底下考的,所以系统是16位的.
我的感觉是x.c[0]的地址就是x.a[0]的第一个字节的地址.
所以我认为答案是0x39在内存中占的第一个字节的值所代表的字符值.
但答案是0x39代表的字符值也就是9;
请大家帮我解答一下,为什么是9;
...全文
89 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangfjj 2004-09-12
  • 打赏
  • 举报
回复
#include<stdio.h>
union
{
int a[2];
char c[4];
}x;
main()
{
x.a[0]=0x39;
x.a[1]=0x38;
printf("%c\n",x.c[0]);
printf("%x\n",x.c[0]);
printf("%d\n",x.c[0]);
}
/*
a[0] a[1]

c[0] c[1] c[2] c[3]
共用体是这样一个对应关系,见上面。

对整数的存储是这样的:
int占两个字节:分别称低字节和高字节
这个可以看一看汇编。
整数的低位放在低字节。
所以0x39,其中的0x39 在低字节,高字节为0x0
但你的输出是以字符格式输出的
0x39(即十进制的57)对应的字符'9'

我把程序改了一下,增加了输出
结果分别是
9
39
57



*/
Squall1009 2004-09-12
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/2665/2665964.xml?temp=.5289423
存放的时候值的位存放在高字节上.
所以0x39存放是00111001 00000000
而不是00000000 00111001
所以c[0]是00111001所以是0x39对应的字符值9

问题解决,结帖.
Squall1009 2004-09-12
  • 打赏
  • 举报
回复
^^
Squall1009 2004-09-11
  • 打赏
  • 举报
回复
0X39占两个字节的时候在内存中为00111001 00000000吗?
为什么不是00000000 00111001啊?
我一直理解的是00000000 00111001..........
hcj2002 2004-09-11
  • 打赏
  • 举报
回复
同意 Flood1984(请不要做浮躁的人)
Flood1984 2004-09-11
  • 打赏
  • 举报
回复
第2个字节为0
Flood1984 2004-09-11
  • 打赏
  • 举报
回复
但0X39只占第一个字节
Squall1009 2004-09-11
  • 打赏
  • 举报
回复
x.a[0]是两个字节的,
x.c[0]是一个字节的.
......
ftkghost 2004-09-11
  • 打赏
  • 举报
回复
printf("%c",x.c[0]);
因为搂主输出的%c是字符型
显示的是char的'9' 而不是int的9
Flood1984 2004-09-11
  • 打赏
  • 举报
回复
x.c[0]的地址就是x.a[0]的第一个字节的地址
正确,
0x39代表的字符值也就是9
是因为'9'的ASCII码是0X39

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧