首页 > 解决方案 > 位域的整数类型

问题描述

位域的整数类型是否重要,或者它基本上是一次性的,例如:

struct font {
    int bold : 1;
    int italics : 2;
    int underline : 1;
};

对比

struct font {
    unsigned int bold : 1;
    unsigned int italics : 2;
    unsigned int underline : 1;
};

对比

struct font {
    char bold : 1;
    char italics : 2;
    char underline : 1;
};

不同的整数类型在这里“做”什么,或者它基本上是一个占位符?

标签: cbit-fields

解决方案


位域使用有符号或无符号类型会导致它可以保存的值不同。在您的第一个示例bold中可以保存值 0 或 -1,而在您的第二个示例bold中可以保存值 0 和 1。

C 标准特别允许int, unsigned int, 或_Bool作为位字段的类型,并支持其他类型的实现定义。大多数实现将允许位字段的任何整数类型。

对于那些这样做的人,类型指定了位域所在的“桶”的大小,因此它可以影响结构的大小。在我的 gcc 机器上,前两个结构的大小为 4,而第三个结构的大小为 1。


推荐阅读