数据的存储方式:
本质上都是01这样的二进制类型,就看应用层如何进行解释。
struct data
{
int a:2;
int b:3;
};
int main()
{
struct data p;
p.a = 2;
p.b = 7;
printf("p.a=%d\n",p.a);
printf("p.b=%d\n",p.b);
return 0;
}
{
int a:2;
int b:3;
};
int main()
{
struct data p;
p.a = 2;
p.b = 7;
printf("p.a=%d\n",p.a);
printf("p.b=%d\n",p.b);
return 0;
}
输出
p.a=-2;
p.b=-1;
结构体data,也就是p.a只占2bit,p.b占3bit;2换成二进制是10,计算机10,第一位是符号位,是负数,计算机数字是用补码表示的,负数真值是数据位(除符号位外的其它位)取反加1,就是10,十制就是2,加上符号位表示负数,所以p.a=-2;
同样的,p.b点3bit,7换成二进制就是111,第一位是符号位,数据位反转加1就是1,真值为-1;
typedef struct data
{
int a:3;
int b:5;
char c;
short int d;
}Data;
int main()
{
int k = 0x12345678;
Data *p = &k;
printf("p->a=0x%x\n",p->a);
printf("p->b=0x%x\n",p->b);
printf("p->c=0x%x\n",p->c);
printf("p->d=0x%x\n",p->d);
return 0;
}
p->a = 0x0
p->b = 0xf
p->c = 0x56
p->d = 0x1234
结构体data占4个字节,高字节存高位;所以前5位是a,后3位是b.最后2个字节放d;