读书人

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

发布时间: 2012-04-18 15:01:59 作者: rapoo

关于struct结构的一道题目,请高手给解释一下
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之前),环境同上
请高手能够给详细的解释一下,越详细越好,我在这里先谢过了。
拜上


[解决办法]
1
因为a占2位,第一位是符号,第二位是数值,赋值1的时候输出1
b=3的时候 符号位和数值都是1,按照补码的规则,结果就是-1
c只有符号位,按照补码规则结果也是-1

2
不能在函数外面写赋值.能写初始化,但不能有赋值,你写的明显是赋值
[解决办法]
test.a=1;取低字节2位,0000 0001,取01,为2
test.b=3;取低字节2位,0000 0011,取11(补码),-1
test.c=1;去低字节1位,0000 0001,取1(补码),-1
查一下位域
[解决办法]
这就是二进制数定义啊

[解决办法]
struct test
{
int a:2;
int b:2;
int c:1;
};
这种表示为变量占多好位,int a:2;表示a占两位

[解决办法]
LZ可以看下这个
http://www.builder.com.cn/2007/1027/583435.shtml
[解决办法]
google 一下c语言的位字段;
第二个问题,赋值和初始化是有区别的,
[解决办法]
就是int类型所占字节啊
[解决办法]
这有lz想要的解释
http://www.cnitblog.com/wuzhimeili/archive/2007/01/17/21963.html
[解决办法]
有些编译器还会涉及到内存对齐问题
[解决办法]
struct test
{
int a:2; //a占2位
int b:2; //b占2位
int c:1; //c占1位
};

总共是5个位 但实际要一个sizeof(int)空间 内存对齐
输出的时候其实已经把里面的值截断了
呵呵这个已经见过两次这样的题目了

[解决办法]
内存对齐的问题,用#pragma pack(size)其中size为你指定的内存对齐方式,一般用1.

读书人网 >C语言

热点推荐