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个字节的空间
字段存储在内存中的顺序取决于机器,有些机器的存储顺序是从左往右,而在另一些机器上,是从右往左。通常来说字段都不容易移植
有些情况要用到这种不可移植的特性,例如以特定硬件设备所用的形式存储数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY