位字段

本文详细介绍了C语言中的位字段概念及其使用方法。包括如何定义位字段、位字段的存储方式、位字段的赋值及初始化等。同时,文章还讨论了位字段的局限性和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 位字段(bit field)是一个signed int或unsigned int中一组相邻的位(C99还允许_Bool类型位字段)。C使用unsigned int作为给位字段结构分配内存空间的基本单位。位字段由一个结构声明建立,该结构声明为每个字段提供标签,并决定字段的宽度。例如,以下声明建立了4个1位字段:

struct {
    unsinged int autfd : 1;
    unsinged int autfc : 1;
    unsinged int autfn : 1;
    unsinged int autfs : 1;
} prnt;

该定义使prnt包含4个1位字段。现在,您可以使用普通的结构成员运算符将值赋给单独的字段:

prnt.itals = 0;
prnt.undln = 1;

变量prnt被存储在一个int大小的存储单元中(虽然本例只使用了其中的4位)。

 

2. 带有位字段结构的结构提供一种保存设置的方便的方法。有时,对于某个设置有两个以上的选择,因此您需要用多位来表示所有的选择。可以使用如下代码:

struct {
    unsigned int code1 : 2;
    unsigned int code2 : 2;
    unsigned int code3 : 8;
} prcode;

可以使用以下方法进行赋值:

prcode.code1 = 0;
prcode.code2 = 3;
prcode.code3 =  102;

如果所声明的总位数超过一个unsigned int大小,将会使用下一个unsigned int存储位置。而且,不允许一个字段跨越两个unsigned int之间的边界,编译器会自动地移位这样的字段定义,使字段按unsigned int边界对齐。这时,会留下一个未命名的若干位。

 

3. 您可以使用未命名的字段主动制造出未命名位。使用一个宽度为0的未命名字段则会迫使下一个字段与下一个unsigned int对齐。例如:

struct {
    unsigned int filed1 : 1;
    unsigned int        : 2; // 制造出一个2位的空洞
    unsigned int filed2 : 1;
    unsigned int        : 0; // 使下一字段偏移到下一个unsinged int位
    unsigned int field3 : 3;
} stuff;

 

4. 字段放置到一个int中的顺序是依赖于机器实现的。因此,位字段往往难以移植。经典地,应该把它们用于不可移植的用途。

 

5. 位字段中的字段不可取其地址。

 

6. 可以使用与初始化普通的结构相同的语法来初始化一个位字段结构:

struct box_props {
    unsigned int opaque : 1;
    unsigned int fill_color : 3;
    unsigned int : 4;
    unsigned int show_border : 1;
    unsigned int border_color : 3;
    unsigned int border_style : 2;
    unsigned int : 1;
}

struct box_props box = {1, 1, 1, 2, 2};

类似地,您可以为位字段成员赋值:

box.fill_color = 0;

还可以使用位字段成员作为switch语句的值表达式,也可以用作一个数组索引。

转载于:https://www.cnblogs.com/qwertWZ/archive/2013/01/26/2877879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值