| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 966 人关注过本帖
标题:求助。。!明天考试。。共用体。。
只看楼主 加入收藏
feng19920101
Rank: 1
来 自:湖北
等 级:新手上路
帖 子:31
专家分:1
注 册:2010-10-10
结帖率:71.43%
收藏
已结贴  问题点数:10 回复次数:12 
求助。。!明天考试。。共用体。。
#include <stdio.h>
main()
{
    union {int a[2];
        long b;
        char c[4];
}s;
    s.a[0]=0x39;
    s.a[1]=0x38;
printf(“%ld\n”,s.b);
printf(“%c\n”,s.c[0]);
}
求答案
搜索更多相关主题的帖子: long 
2011-01-14 00:42
aaronhexin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:199
注 册:2010-12-6
收藏
得分:3 
共用体是共用一段存储,这个题目还得考虑字节存储的顺序,大端还是小端,我的是小端,
数据的低字节存在低地址处。
整个数据在内存中的组织是这样的:
图片附件: 游客没有浏览图片的权限,请 登录注册

所以 b= 0x39=57D
  c[0] = 0000 1001B =9D
2011-01-14 05:26
gongyaping
Rank: 4
来 自:广东肇庆怀集
等 级:业余侠客
帖 子:174
专家分:257
注 册:2010-8-1
收藏
得分:3 
不会的路过……
2011-01-14 07:21
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
收藏
得分:3 
应该是随机的数字和字符,因为共用体变量中起作用的成员是最后一次存放的成员.因此如果想输出printf(“%ld\n”,s.a[1]);是可以的(s.a[1]=56),如果想输出printf(“%ld\n”,s.a[0]);是不行的,因为共用体变量中起作用的成员是最后一次存放的成员,虽然编译不会出错,也可以运行,但输出是随机的。printf(“%ld\n”,s.b);
printf(“%c\n”,s.c[0]);随机输出,因为并没有对他们赋值。
2011-01-14 16:56
aaronhexin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:199
注 册:2010-12-6
收藏
得分:0 
回复 4楼 lqpqbyb
你的意思是这个题目每次的结果都会不一样?
2011-01-14 16:59
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
收藏
得分:0 
回复 5楼 aaronhexin
每个C系统应该都不一样吧,反正不是正确的值,但如果在同一个系统里运行,那值不是正确的,但也是固定的
2011-01-14 17:08
aaronhexin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:199
注 册:2010-12-6
收藏
得分:0 
你得先弄明白这个共用体占用多少个字节的内存,8个,a是个数组,a[0] a[1]都存下了。
若在后面再给s.b赋值才会把a[0]覆盖
2011-01-14 17:09
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
收藏
得分:0 
回复 7楼 aaronhexin
呵呵,弄错了,共用体变量所占内存长度等于最长成员长度,该共用体的各个成员长度均是4个字节,因此可以同时输出s.a[0],s.a[1](各占二字节够用,不会覆盖),不过由于没对s.b赋值,因此输出是随机的,如果有对s.b赋值,就把s.a[0],s.a[1]覆盖了,因为b是长整型占4个字节。如果b是短整型的,对其赋值只覆盖s.a[0](虽然s.a[0]被b覆盖了,但想s.a[0]输还是可以输出来,只是现在的值是现在s.b的值),不覆盖s.a[1]。因为共用体的各个成员及共用体本身的起始地址是一样的。
2011-01-14 17:31
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:3 
图片附件: 游客没有浏览图片的权限,请 登录注册
啥也不说了,给个最有说服力的答案。。。

勤能补拙,熟能生巧!
2011-01-14 17:43
lqpqbyb
Rank: 1
等 级:新手上路
帖 子:18
专家分:8
注 册:2011-1-8
收藏
得分:0 
aaronhexin,有些地方提醒了对,不胜感激。
以下是题目详细分析步骤(有错的地方希望能指正):
共用体变量s所占的内存长度等于最长成员的长度,题目有三个成员:整形数组a[2]共占用内存4个字节;长整型b变量也占4个字节;字符数组c[4]也占4个字节。因此s占的内存长度为4字节。
共用体本身及共用体的各成员起始地址均是相同的。
aaronhexin指出字节存储顺序是按大小端来的,本人自己TC2是小端的,其它版本可能不一样吧。
存储过程如下:
s.a[0]=0x39,是16进制,十进制数就是57,二进制数就是:0000 0000 0011 1001
s.a[1]=0x38,是16进制,十进制数就是56,二进制数就是:0000 0000 0011 1000
当程序执行到这二条赋值语句结束时,本人TC是小端,因此存储结构顺序如下:

printf(“%ld\n”,s.b);当执行这条语句时 b为 0000 0000 0011 1000 0000 0000 0011 1001,转化成十进制数正好是3670073。
printf(“%c\n”,s.c[0]);c[0]为 0011 1001,十进制数正好是57,输出的是字符,因此是'9'(9的ASCII码为57)。
为了说明上面说的正确性。
把原先题目的程序稍微改动一下:
#include <stdio.h>main(){    union {int a[2];        long b;        char c[4];}s;    s.a[0]=-12;      /* 原先s.a[0]=57改为-12;*/    s.a[1]=0x38;printf(“%ld\n”,s.b);printf(“%c\n”,s.c[0]);}按照上面方法得出存储结构顺序如下:

负数的补码是正数补码按位取反加1,因此-12的补码:1111 1111 1111 0100;
输出结果:s.b=3670073;s.c[0]=ASCII码等于244的字符(不好打)。
Why?
b:0000 0000 0011 1000 1111 1111 1111 0100
对应的十进制数为3735540;
S.c[0]=-12,输出的格式是字符因此是ASCII码等于244的字符.
尝试把s.c[1]以%d输出为-1;
2011-01-14 20:15
快速回复:求助。。!明天考试。。共用体。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058124 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved