C语言中,关于共用体的

[复制链接]
查看11 | 回复4 | 2011-8-24 21:01:41 | 显示全部楼层 |阅读模式
#include
main()
{ union{short i[2];

long k;

char c[4];
}r,*s=&r;
s->i[0]=0x39;s->i[1]=0x38;
printf("%x\n",s->c[0]);
}
已知字符0的ASCII码值得十进制数是48,且数的第0个元素在低位。以上程序的运行结果过是:39
附带:最主要的是我不是懂这个0的ASCII有什么用,还有就是把“位”操作的步骤也详细写出来,我不是很懂这个

回复

使用道具 举报

千问 | 2011-8-24 21:01:41 | 显示全部楼层
你好!!!首先我们了解联合体的所有成员是在内存中共享一块内存的,在某一时刻只能有一个成员使用这个内存!!!我们来看看一个例子:#includeunion { int i; char x[2]; }a; void main() { a.x[0] = 10; a.x[1] = 1; printf("%d",a.i); } 答案:266 解释如下:union{ int i; char x[2]; }a;
在联合体a中定义了两种数据类型,字符数组x以及整形变量i.其中整形变量是16位的,数组大小为2的字符数组为8X2=16位。如此...
回复

使用道具 举报

千问 | 2011-8-24 21:01:41 | 显示全部楼层
主要考虑到计算机中内存大端还是小端的问题!short 2个字节,long4个字节,char1个字节!那么union类型4个字节。你只给了s一个一字节的数值。有一个字节全部为0,所以这时候每个计算机的操作就不一样了。0x39指的是39为16进制,不是0...
回复

使用道具 举报

千问 | 2011-8-24 21:01:41 | 显示全部楼层
s->i[0]=0x39;s->i[1]=0x38;
0x39和0x38 表示的是十六进制的两个数printf("%x\n",s->c[0]);
十六进制输出s->c[0],结果肯定是39啊......你把0x39改成0x3a输出就是3a,不涉及其他的呀,就是一个简单输出,你是不是...
回复

使用道具 举报

千问 | 2011-8-24 21:01:41 | 显示全部楼层
这个跟字符’0‘有什么关系?共用体 共用同一块内存区域 s->c[0] 就是取的内存的第一块区域 就是i[0]...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行