起抛砖引玉之用,各种思维逻辑BUG层出不穷,望君深知
代码
#include <stdio.h>
struct subject
{
char main_course : 2;
char minor_course : 2;
char not_use : 4;
};
int main(void) {
char a=0; // 不初始化有可能遇到意想不到的错误,看编译器的优化
a |= 6; // 假设2-3代表主课语数外,0-1代表副科理化生
struct subject *p;
p = (struct subject *)&a;
// 这里的实质是让结构体类型的指针访问这个变量
// 指针是直接访问内存中的数据,所以这里要转化成指针访问
printf("%d\n",a);
printf("%d\n",p->main_course); // 1
printf("%d\n",p->not_use); // 0
printf("%d\n",p->minor_course); // -2
p->main_course = 2;
printf("%d\n",a); // 6
return 0;
}
## 优缺点
优点:
1、能节省一定的存储空间,且便于阅读(涉及到位操作)。就像上面,时间一长,根本不记得哪一位是什么标志位了,在那个地方做了改变。用了位域之后可读性大大增加
缺点:
1、这里我最开始简单的理解为结构体中位域和变量的存储是一样的,即高4位存0,3-2位存01,1-0位存10;但实际存储之后才发现它将你变量的低位按位域格式变为高位了,高位按位域变为低位了(这里我还只是实验栈区的变量,堆区的没有实验,堆栈生长方向不一样,感觉可能有区别)。在涉及到变量赋值,内存拷贝,网络传输的时候这些都是需要考虑的点。所以我认为位域一般是在内存吃紧、模块的功能比较简单的情况下使用
2、后续扩展性不好,就比如上面的副科用两位来表示,共有四种可能。但如果现在要求政史地也要加进去,那一共6种可能,那你现在是不是要改变结构体,那些使用这个结构体的是不是全部要改变,缺一处没有修改就会导致大问题。实际生产中需求是不断增加的,用位域一般就不太合适了
## 个人总结
除非有要求或功能简单,一般不建议用位域,后期修改调试难