关于struct结构的一道题目,请高手给解释一下

queshangxintou 2008-04-12 09:53:15
struct test
{
int a:2;
int b:2;
int c:1;
};


void main()
{

test data;
data.a = 1;
data.b = 3;
data.c = 1;
printf("%d,%d,%d\n", data.a, data.b, data.c);
}
问题1:程序的输出结果为什么是1,-1,-1 运行环境vc6.0 + xp
问题2: test data;
data.a = 1;
data.b = 3;
data.c = 1;
为什么把这几行代码定义为全局的程序编译就会出错(放在main之前),环境同上
请高手能够给详细的解释一下,越详细越好,我在这里先谢过了。
拜上
...全文
149 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅得不敢出门 2008-04-12
  • 打赏
  • 举报
回复
struct test
{
int a:2; //a占2位
int b:2; //b占2位
int c:1; //c占1位
};

总共是5个位 但实际要一个sizeof(int)空间 内存对齐
输出的时候其实已经把里面的值截断了
呵呵这个已经见过两次这样的题目了
queshangxintou 2008-04-12
  • 打赏
  • 举报
回复
楼上的不对啊 我的vc6 怎么是4 啊
wenjun1130 2008-04-12
  • 打赏
  • 举报
回复
比如 在下面程序 在vc6.0中结果位12
#include <stdio.h>
struct test
{
int a:2;
char b:2;
int c:1;
};


void main()
{

printf("%d\n",sizeof(test));
}

wenjun1130 2008-04-12
  • 打赏
  • 举报
回复
有些编译器还会涉及到内存对齐问题
wenjun1130 2008-04-12
  • 打赏
  • 举报
回复
wenjun1130 2008-04-12
  • 打赏
  • 举报
回复
就是int类型所占字节啊
queshangxintou 2008-04-12
  • 打赏
  • 举报
回复
在深入一点 那 a b c 所占用的物理空间是多少
为什么用sizeof得到的值是 4
ryfdizuo 2008-04-12
  • 打赏
  • 举报
回复
google 一下c语言的位字段;
第二个问题,赋值和初始化是有区别的,
wenjun1130 2008-04-12
  • 打赏
  • 举报
回复
wenjun1130 2008-04-12
  • 打赏
  • 举报
回复
struct test
{
int a:2;
int b:2;
int c:1;
};
这种表示为变量占多好位,int a:2;表示a占两位
arong1234 2008-04-12
  • 打赏
  • 举报
回复
这就是二进制数定义啊
ttkk_2007 2008-04-12
  • 打赏
  • 举报
回复
test.a=1;取低字节2位,0000 0001,取01,为2
test.b=3;取低字节2位,0000 0011,取11(补码),-1
test.c=1;去低字节1位,0000 0001,取1(补码),-1
查一下位域
  • 打赏
  • 举报
回复
1
因为a占2位,第一位是符号,第二位是数值,赋值1的时候输出1
b=3的时候 符号位和数值都是1,按照补码的规则,结果就是-1
c只有符号位,按照补码规则结果也是-1

2
不能在函数外面写赋值.能写初始化,但不能有赋值,你写的明显是赋值
  • 打赏
  • 举报
回复
内存对齐的问题,用#pragma pack(size)其中size为你指定的内存对齐方式,一般用1.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧