10、位操作

未完成。后面补上

位字段

操控位的第二种方法是位字段(bit field)。

声明位字段

位字段通过一个结构声明建立,且结构中的成员类型只能是整型(例如char、_bool、int等等),成员后面跟冒号,再跟整数常量,用来表示该成员占用的bit位个数。如下

struct {
    unsigned int autfd : 1;
    unsigned int bldfe : 1;
    unsigned int undln : 1;
    unsigned int itals : 5;
} prnt;

该声明包含3个1位的字段和1个5位的字段

声明的总位数为:1+1+1+5 = 8

位字段赋值

根据上面声明,可以通过点运算符给字段赋值

// 由于下面三个字段都只有1位,所以只能赋值为1或0
prnt.autfd = 0;
prnt.bldfe = 1;
prnt.undln = 1;

// itals有5位,最大可赋值31
prnt.itals = 31;

赋值时,要确保所赋的值不超过字段可容纳的范围,否则只会存储一部分数据

也要确保字段的位数不能超过定义的类型范围。例如char a : 10;就是错误的,因为char类型只能容纳8个bit位

位字段内存分配

声明的总位数超过了一个unsigned int 类型的大小时,会用到下一个unsigned int 类型的存储位置。因为一个字段不允许跨越两个unsigned int 之间的边界。

struct prnt{
    unsigned int autfd : 10;
    unsigned int bldfe : 15;
    unsigned int undln : 20;
    unsigned int itals : 30;
};
// 假设当前系统unsigned int类型占32位

因为是unsigned int 类型,所以编译器每次开辟的空间是以4个字节为单位开辟的。如果是char类型则以1个字节为单位开辟

autfd 占用10个bit位,bldfe占用15个bit位,开辟的32位空间就占用了25位,而第三个成员undln需要20个bit位的空间,开辟的第一个32位空间就不够了,所以会开辟第二个32位的空间用了存放undln。第四个成员itals要占用30个bit位,又需要再开辟第三个32位的空间,所以上面struct prnt类型占用了12个字节的空间

字段存储在内存中的顺序取决于机器,有些机器的存储顺序是从左往右,而在另一些机器上,是从右往左。通常来说字段都不容易移植

有些情况要用到这种不可移植的特性,例如以特定硬件设备所用的形式存储数据

posted @   7七柒  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示