小甲鱼 发表于 2017-7-2 17:47:27

S1E53:位域

待更新

1秒 发表于 2017-10-9 20:28:23

视频中讲解的时候,说明了位域的宽度不能超过它所依附的数据类型的长度,但是在讲解无名位域时举的例子却让一个unsigned int型位域有最大424的宽度,是我理解有误还是示例不恰当呢?

weiy、 发表于 2018-3-17 14:14:27

{:10_249:}

清尘yt 发表于 2019-8-17 14:46:06

位域,也叫位段,位字段
无名位域主要用于调整位域成员之间的位置

Down一down 发表于 2020-11-8 20:48:33

{:10_249:}

阳光大男孩 发表于 2022-9-25 11:09:07

{:10_249:}

一个大西瓜嚯嚯 发表于 2023-9-4 14:55:05

{:5_90:}

Gordon1 发表于 2024-3-2 21:24:01

{:5_90:}

检测点11.1 发表于 2024-4-28 15:19:25

@FishC 请总结“S1E53:位域”的知识点备忘。

FishC 发表于 2024-4-28 15:19:45

检测点11.1 发表于 2024-04-28 15:19
@FishC 请总结“S1E53:位域”的知识点备忘。

位域是一种用于优化内存使用的技术,可以让我们在定义结构体中的成员时,指定使用几个二进制位来存储该成员的值。这样做可以节省内存空间,特别适用于需要大量存储开关状态等信息的情况。

使用位域需要注意以下几点:

1. 定义位域变量时要使用无符号类型(unsigned),以避免负数的问题。

2. 定义位域成员时,需要指定使用多少个二进制位来存储值。例如,`unsigned int flag : 4;` 表示flag成员使用4个二进制位来表示。

3. 多个位域成员可以在同一行进行定义,它们之间会按顺序依次分配二进制位。

4. 位域成员可以和普通成员混合使用,但需要注意数据对齐问题。

下面是一个例子,演示了如何使用位域:

#include <stdio.h>

struct Flag {
    unsigned int a : 1;
    unsigned int b : 2;
    unsigned int c : 3;
    unsigned int d : 4;
};

int main() {
    struct Flag flag;

    flag.a = 1;// 使用1个二进制位存储
    flag.b = 2;// 使用2个二进制位存储
    flag.c = 7;// 使用3个二进制位存储
    flag.d = 9;// 使用4个二进制位存储

    printf("%d %d %d %d\n", flag.a, flag.b, flag.c, flag.d);

    return 0;
}

输出结果为:
1 2 7 9

这个例子中,结构体`Flag`定义了四个位域成员。其中,`a`使用一个二进制位存储,`b`使用两个二进制位存储,`c`使用三个二进制位存储,`d`使用四个二进制位存储。通过给位域成员赋值,我们可以看到它们的存储结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: S1E53:位域