关于struct结构的一道题目,请高手给解释一下,该怎么处理
关于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.
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.