免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 姚世友
打印 上一主题 下一主题

[C] 考考大家的C语言基础  关闭 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
21 [报告]
发表于 2008-12-18 09:55 |只看该作者
中国的学生都是被楼主这样的题目以及教科书搞坏的。

论坛徽章:
0
22 [报告]
发表于 2008-12-18 10:15 |只看该作者
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv)
{
    union
    {
          struct  
          {
              char a:2;         
              char b:3;         
              char c:3;  
               
          }d;
         char e;
    } f;
   
    f.e = 3;
    printf(" %d\n",f.d.a);   
  
    return 0;
}
结果怎么为-1,感觉应该为-3嘛

论坛徽章:
0
23 [报告]
发表于 2008-12-18 10:18 |只看该作者
...

论坛徽章:
0
24 [报告]
发表于 2008-12-18 10:27 |只看该作者
语法错误..

论坛徽章:
0
25 [报告]
发表于 2008-12-18 10:45 |只看该作者
基础很扎实,题目很吓唬人!
会做的是基础好的人。
不会做的也未必不是能人。
这题目我交给计算机,他会做,他做出来什么我都认为对的,因为他比我们扎实!

论坛徽章:
0
26 [报告]
发表于 2008-12-18 11:28 |只看该作者

回复 #1 姚世友 的帖子

这个程序是不可移植的,c语言本身没规定字段从左到右还是从右到左分配,而是依赖于机器。

论坛徽章:
0
27 [报告]
发表于 2008-12-18 11:39 |只看该作者
原帖由 Pro_sky 于 2008-12-17 23:04 发表
有符号数是按照符号位补齐,这里的符号位就是1


用printf加%d参数打印时,a被提升到int类型。而a是一个位且为1,所以扩展后就是按有符号int类型,所以全部位都是1,而全1是-1的补码,所以输出当然是-1。
你可以先做这么一步:int t =(int)f.d.a;然后打印t,你就可以看到t就是-1。也就是printf在打印前作的转换。

论坛徽章:
0
28 [报告]
发表于 2008-12-18 11:41 |只看该作者
原帖由 rhinux 于 2008-12-18 10:45 发表
基础很扎实,题目很吓唬人!
会做的是基础好的人。
不会做的也未必不是能人。
这题目我交给计算机,他会做,他做出来什么我都认为对的,因为他比我们扎实!


貌似这题目招来很大的异议....多多包涵,新人一个....

论坛徽章:
0
29 [报告]
发表于 2008-12-18 11:45 |只看该作者

回复 #28 姚世友 的帖子

这个在嵌入式系统中使用挺多的.

论坛徽章:
0
30 [报告]
发表于 2008-12-18 11:57 |只看该作者

回复 #22 xiaochongs 的帖子

char f = 3; (0x03 -- 00000011), 取道d.a里面还是11, 符号位还是1, 那么%d打印之后, 还是0xF补齐, 因此结果还是-1.
这个题目考察union,struct之外,还隐藏一个陷阱,就是符号变长整型转换问题, 可以去看看cs:app的第二章.  冒号可以做bitfield, 也可以做gcc扩展中的赋值,是有些混淆耳目.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP