今天看书看到了位制的概念,对这个做出一点总结。
位制就是为了减小存储大小,把一个char, unsigned int, int的存储空间进行拆分后,对每个进行操作。
给出一段代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct test
{
char a : 4;
char b: 1;
char c: 1;
}test;
int main()
{
test m;
m.a = 3;
m.b =3;
m.c =3;
printf("%d\n" ,sizeof(test));
printf("%d\n" ,sizeof(char));
return 0;
}
上面的代码运行后发现,输出为1 ,1。
也就是说,test的长度和char的长度是一样的。其实说白了test就是把一个char类型的存储空间,拆分成4位,1位,1位的存储空间进行操作。
下面,如果test里的大小类型不一致呢:
#include <stdio.h>
#include <stdlib.h>
typedef struct test
{
char a : 4;
char b: 1;
int c: 1;
}test;
int main()
{
test m;
m.a = 3;
m.b =3;
m.c =3;
printf("%d\n" ,sizeof(test));
printf("%d\n" ,sizeof(char));
printf("%d\n" ,sizeof(int));
return 0;
}
代码输出为 8, 1, 4。
这里应该是有一个对其的概念,也就是说test把char类型的也扩张成4字节的了,为了跟int的对齐。
对位制,不能把设置的位数长度大于类型的长度,比如
typedef struct test
{
char a : 10;
char b: 1;
char c: 8;
}test;
这里10已经超过了char类型的长度,所有编译错误。
还有对于如果总长度大于设置的类型呢
#include <stdio.h>
#include <stdlib.h>
typedef struct test
{
char a : 8;
char b: 1;
char c: 8;
}test;
int main()
{
test m;
m.a = 3;
m.b =3;
m.c =3;
printf("%d\n" ,sizeof(test));
printf("%d\n" ,sizeof(char));
return 0;
}
输出结果为3, 1
可以看出来,test自动分配了三个char类型的空间。大体了解了吧