免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
61 [报告]
发表于 2008-12-20 13:44 |只看该作者
原帖由 o_distance 于 2008-12-20 00:29 发表
答案前面的兄弟已经给了很好的解答。

这种涉及位域的题目,一直是很多c程序员面试的必考题,属于基础。这道题是典型。我们先不说不同系统关于字节序的争议。很多人知道位域,但他不一定能了解想到类型转换,想到了类型转换,却不一定能想到补码。这道题考的不仅仅是一个知识点。所以说他是经典题目。在很多公司,你会经常看到这类题目.


谢谢,

论坛徽章:
0
62 [报告]
发表于 2008-12-20 13:58 |只看该作者
#include <stdio.h>
int main(int argc, char** argv)
{
    union
    {
          struct  
          {
              char a:1;         
              char b:2;         
              char c:3;        
          }d;
        char e;
    } f;
   
    f.d.a = 1;
    printf("%d\n",f.d.a);   
    getchar();
    return 0;
}

小字节顺上:
printf时,将f.d.a转换成一个有符号的int类型,而f.d.a在小字节最前端,刚好是符号位,所以是-1,而
大字节顺上:
printf时,将f.d.a转换成一个有符号的int类型,而f.d.a在小字节最后端,非符号位,所以是1


+++++++++++++++
int main(int argc, char** argv)
{
    union
    {
          struct  
          {
              char a:1;         
              char b:2;         
              char c:3;        
          }d;
        char e;
    } f;
   
    f.e = 1;
    printf("%d\n",f.d.a);   
    getchar();
    return 0;
}
小字节顺:
f.e = 1中的1只影响f.d.a,所以为a为-1,b和c为0
大字节顺:
f.e = 1中的1对a,b,c都不影响,所以都为0

论坛徽章:
0
63 [报告]
发表于 2008-12-20 14:01 |只看该作者
结果和机器以及编译器有关吧

论坛徽章:
0
64 [报告]
发表于 2008-12-20 14:15 |只看该作者
原帖由 千年沉寂 于 2008-12-20 14:01 发表
结果和机器以及编译器有关吧


我出这题的本意其实并不在此.
是一个Union,Struct中的内存分配---->类型提升----->补码

当然把这题考虑的更周全是最好,,,搞C语言细心很重要.(我是这么认为的)

论坛徽章:
0
65 [报告]
发表于 2008-12-20 18:02 |只看该作者
学习了,不错!!!

论坛徽章:
0
66 [报告]
发表于 2008-12-20 18:39 |只看该作者
原帖由 xiaochongs 于 2008-12-18 10:15 发表
#include
#include
#include

int main(int argc, char** argv)
{
    union
    {
          struct  
          {
              char a:2;         
              char b:3;         
    ...




decimal: "3" => binary "11"
补齐后为 "11111111" => decimal "-1"

论坛徽章:
0
67 [报告]
发表于 2008-12-21 01:26 |只看该作者
很巧妙的一道题 up

论坛徽章:
0
68 [报告]
发表于 2008-12-21 10:53 |只看该作者
原帖由 waternie 于 2008-12-18 12:49 发表
想了一下,可能是-1,也坑能是0,依赖于大端还是小端。
对不?

正解

论坛徽章:
0
69 [报告]
发表于 2008-12-21 11:14 |只看该作者
原帖由 Aquester 于 2008-12-19 21:58 发表
#include
int main(int argc, char** argv)
{
    union
    {
          struct  
          {
              char a:1;         
              char b:2;         
              char c:3;     ...


这里好像和大端小端没关系吧。

论坛徽章:
0
70 [报告]
发表于 2008-12-21 15:11 |只看该作者
还真是没看清是有符号数,呵呵,原来这样也会符号展开啊。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP