在内存中存取数据的最小单位一般是字节,但C语言允许在一个结构体中以位为单位进行存储。这就为一些内存比较小的嵌入式设备提供了方便。
例如:
#include
struct bit_data{
int a:6;
int b:4;
int c:4;
int d;
} p;
int main(){
p.a=13;
p.b=10;
p.c=8;
p.d=45;
printf("%d,%d,%d,%d",p.a,p.b,p.c,p.d);
printf("\na=%d",sizeof(p.d));
}
程序给a分配6位的存储空间,b和c分配4位存储空间。以上程序运行结果为:13,-6,-8,45
4
计算机中的数据都是用补码表示。这里b是四位表示出来就是1010,对1010再求补码就是1110,1110对应的十进制数就是-8。
可以看到我们可以用sizeof(p.d)求得d所占的空间。但是不能用sizeof(p.a)计算a所占的空间。因为a是用位段表示的。
重要的一点:当我们用sizeof(p)计算结构体变量p所占的内存空间时,可能会误认为是4个字节,其实不然,正确是占8个字节因为gcc对内存管理采取的是压缩法。而要vc的话结果就会变成16。这就是所谓的内存对齐的问题。
阅读(677) | 评论(0) | 转发(0) |