你说的是位域吧,以前我很少用过,花了点时间看了下,这总方法是可行的。
先开始自己定义了位域,但是编译器总是报错,后来发现报错也是可以使用的。一下是我写的程序:
struct byte
{
int b0:1;
int b1:1;
int b2:1;
int b3:1;
int b4:1;
int b5:1;
int b6:1;
int b7:1;
};
int main(void)
{
struct byte dat;
int bb=0;
////假设为输出,并输出0xf0;
PAout(3)=0;
PAout(9)=0;
PAout(12)=0;
PBout(0)=0;
PBout(3)=1;
PBout(9)=1;
PAout(5)=1;
PBout(10)=1;
dat.b0=PAout(3);
dat.b1=PAout(9);
dat.b2=PAout(12);
dat.b3=PBout(0);
dat.b4=PBout(3);
dat.b5=PBout(9);
dat.b6=PAout(5);
dat.b7=PBout(10);
//此时位域的值是0xf0;
// *((int *)&dat)=0xaa;//给位域赋值
bb=(*((int *)&dat));//读位域的值
printf("bb=%x\r\n",bb);
while(1);
}
以上程序是可行,但是有些问题。
最前面通过给位域的每一个位赋值,在读位域前的值应该是0xf0,(调试看内存也是0xf0),
但是在读位域时“bb=(*((int *)&dat));//读位域的值”,其bb的值却是0x200000f0;
0x200000f0,前面的“2”不知道是从哪里来的。(有个勉强的方法,也就是把域的值强制转换成char ,前面的2就没有了),
当我给域赋值了,在读(也就是恢复“*((int *)&dat)=0xaa;”),这时读出来的值就是对的bb=0xaa;
不知道这是为什么,求指点,有兴趣的朋友可以自己试试,看会不会出现这总情况,在此谢过大家了。
|