C中位域判断

起抛砖引玉之用,各种思维逻辑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种可能,那你现在是不是要改变结构体,那些使用这个结构体的是不是全部要改变,缺一处没有修改就会导致大问题。实际生产中需求是不断增加的,用位域一般就不太合适了

## 个人总结
    除非有要求或功能简单,一般不建议用位域,后期修改调试难

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值