免费注册 查看新帖 |

Chinaunix

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

[C++] 结构体位域问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-09 21:25 |只看该作者 |倒序浏览
  1. typedef struct
  2. {
  3.         int a:2;
  4.         int b:2;
  5.         int c:1;
  6. }test;

  7. int main()
  8. {
  9.         test t;
  10.         t.a = 1;
  11.         t.b = 3;
  12.         t.c = 1;
  13.         
  14.         printf("size: %d\n", sizeof(t));
  15.         printf("%d\n", t.a);
  16.         printf("%d\n", t.b);
  17.         printf("%d\n", t.c);
  18.         return 0;
  19.         
  20. }
复制代码
打印结果是1,-1,和-1?麻烦能否解释一下呢。特别是t.b=-1和t.c=-1.

[ 本帖最后由 cnzhaopeng 于 2009-9-9 21:30 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-09 22:47 |只看该作者

回复 #1 cnzhaopeng 的帖子

这是unsigned int 和 int 的区别。如果你定义为unsigned int, 会输出1, 3,1

论坛徽章:
0
3 [报告]
发表于 2009-09-10 11:10 |只看该作者
原帖由 donalduk 于 2009-9-9 22:47 发表
这是unsigned int 和 int 的区别。如果你定义为unsigned int, 会输出1, 3,1


能否详细说明一下呢?比如t.c=1是为正呀?怎么输出就是-1?

还有t.b=3,这个也是正数,只是它只占两位,00,01,11,10两位最多表示-2到+1。

不是unsigned int 和int这么简单吧?

论坛徽章:
0
4 [报告]
发表于 2009-09-10 11:20 |只看该作者
使用位域程序,最好将每个位域使用的类型定义为 unsigned char 类型,每个位域最大数据为1个字节,unsigned char 已经足够使用了,打印的时候不会出错。
大概定义的样子为
struct    aaaaa {
     unsigned    char      a1: 3;
     unsigned    char     a2: 2;
     unsigned     char     a3:3;
};

论坛徽章:
0
5 [报告]
发表于 2009-09-10 17:15 |只看该作者

回复 #3 cnzhaopeng 的帖子

如果是有符号的两位数(00 01 10 11),00 和 10 都代表的是0, 11 代表的是-1, 01代表的是1. 这是因为最高位是符号位。

论坛徽章:
0
6 [报告]
发表于 2009-09-10 21:55 |只看该作者
typedef struct
{
        unsigned int a:2;
        unsigned int b:2;
        unsigned int c:1;
}test;
否则有符号位。

论坛徽章:
0
7 [报告]
发表于 2009-09-11 13:49 |只看该作者
原帖由 ljmmail 于 2009-9-10 11:20 发表
使用位域程序,最好将每个位域使用的类型定义为 unsigned char 类型,每个位域最大数据为1个字节,unsigned char 已经足够使用了,打印的时候不会出错。
大概定义的样子为
struct    aaaaa {
     unsigned  ...

位域是依赖于编译器的,有的编译器定义位域为unsigned char型会报warning
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP