免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3323 | 回复: 16
打印 上一主题 下一主题

[C] 请帮忙看一个C语言的基础题,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-23 11:58 |只看该作者 |倒序浏览

#include <iostream>
using namespace std;

union
{
&nbsp;&nbsp;&nbsp;&nbsp;struct  
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char a:1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char b:2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c:3;
&nbsp;&nbsp;&nbsp;&nbsp;} d;
&nbsp;&nbsp;&nbsp;&nbsp;char e;
} f;

int main(int argc, char** argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;f.e = 1;
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n", f.d.a);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


请问上述代码为什么输出-1呢,谢谢

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-11-23 13:29 |只看该作者
你给f.e赋值,可为什么要取f.d.a的值呢?

论坛徽章:
0
3 [报告]
发表于 2008-11-23 13:38 |只看该作者
原帖由 lenovo 于 2008-11-23 13:29 发表
你给f.e赋值,可为什么要取f.d.a的值呢?

是出题人要取,我不知道是什么原因输出-1,能否帮忙解释一下是为什么,谢谢!

论坛徽章:
0
4 [报告]
发表于 2008-11-23 13:43 |只看该作者
给e值了,前面的abc不是都失去作用了么
再说我记得共用体是不是不能初始化的啊

论坛徽章:
0
5 [报告]
发表于 2008-11-23 13:45 |只看该作者
原帖由 wucaizhen 于 2008-11-23 13:43 发表
给e值了,前面的abc不是都失去作用了么
再说我记得共用体是不是不能初始化的啊

char e和结构体d共用空间,虽然是给e赋值,但是如果从d的角度去看,相当于d的空间也有了值,此时就看如何取值了,不知道内存结构是怎么样的

论坛徽章:
0
6 [报告]
发表于 2008-11-23 14:55 |只看该作者
char e和结构体d共用空间,虽然是给e赋值,但是如果从d的角度去看,相当于d的空间也有了值,此时就看如何取值了,不知道内存结构是怎么样的
恩,对,要看你的结构体的空间是怎么样的了?
正常你的结构体是:
1+2+3个位,他们的内存顺序是1,2,3,应该是1为低位,3为高位(可能顺序是这样的,跟机器有关)
你的char e一个字节,8位,给它1后,它的8为根据1的ascII码被初始化
而你仅仅取的是初始化后的1位,也就是仅仅取最低位,打印的时候%d把你要打的东西当成有符号数去打,而且只会去打1位
因为你的char a:1;
而1是有符号数-1的补码,所以
打出-1

论坛徽章:
0
7 [报告]
发表于 2008-11-23 15:26 |只看该作者
-1的补码是全1

论坛徽章:
0
8 [报告]
发表于 2008-11-23 17:54 |只看该作者
猜想赋值之后,内存中那个字节的序列可能是00000001,假设结构体占的是低六位,那么d.a的值只有一个位:1.
这一个位用%d格式化出来,计算机是怎么处理成-1的?

论坛徽章:
0
9 [报告]
发表于 2008-11-24 02:59 |只看该作者

回复 #1 insnowind 的帖子

union的意思你可以去查一下,任何一本C的书都可以。

union中的所有元素公用一个空间,你在e中存的啥,你通过d取出来时就是啥,考虑到位,补码等。

论坛徽章:
0
10 [报告]
发表于 2008-11-24 16:31 |只看该作者
printf,
%d放一个int吧,char不对吧,

[ 本帖最后由 yuanchengjun 于 2008-11-24 16:32 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP