免费注册 查看新帖 |

Chinaunix

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

如下代码的输出为什么是是 4 5 -2 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-18 14:23 |只看该作者 |倒序浏览
typedef struct bitstruct
{
int b1:5;
int :2;
int b2:2;
}bitstruct;

int main(int argc, char *argv[])
{
bitstruct b;
printf("%d\n",sizeof(bitstruct));
memcpy(&b,"EMC Examination",sizeof(b));
printf("%d,%d\n",b.b1,b.b2);
return 0;
}

谢谢 :)

论坛徽章:
0
2 [报告]
发表于 2012-06-18 15:08 |只看该作者
我给你说3点,你自己去看。

1.位域溢出
2.位域布局
3.字节序

论坛徽章:
0
3 [报告]
发表于 2012-06-19 11:11 |只看该作者
我的PC是32位机,小端存储,新手上路欢迎指正:
1. printf("%d\n",sizeof(bitstruct));   = 4
    该结构体将一个int(32个bit位)分为 b1 (占5个bit位),匿名段(占2个bit位),b2(占2个bit位)-------去了解下“位域”的概念
    所以一个sizeof(struct) 还是一个sizeof(int)的大小。

2. memcpy(&b,"EMC Examination",sizeof(b));  
    将字符串"EMC Examination"中的sizeof(b)个字符按你PC的“大小端存储”贮存到&b中,也就是说“EMC ”将会存到&b中,这里有个“大小端”的概念。
    去查字符“EMC”的ASC||码:E=69 M=77 C=67 space=32,他们的二进制表示为"00100000(space) 01000011(C) 01001101(M) 01000101(E)",并且将按这样的顺序存储到一个int中

3. printf("%d,%d\n",b.b1,b.b2);
    b.b1输出的将是“00100000 01000011 01001101 01000101”的前5个bit,即00101,如果要%d输出的话,编译器将把其转化为00000..(27个0)00101,值为5
    b.b2输出的将是“00100000 01000011 01001101 01000101”的第8,9位,即10,如果要%d输出的话,编译器将把其转化为11111..(30个1)10,值为-2。
    **注意符号位**

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2012-06-19 11:32 |只看该作者
lxlwwtx 发表于 2012-06-19 11:11
我的PC是32位机,小端存储,新手上路欢迎指正:
1. printf("%d\n",sizeof(bitstruct));   = 4
    该结构 ...
这个解释很清楚。加上一个位的数字顺序说明就perfect了。
31------------------------------------------------------> 0
00100000(space) 01000011(C) 01001101(M) 01000101(E)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP