4

我的理解是位字段声明符的类型应该是某种 int 类型。事实上,这里是来自 C99 标准的行

“位域的类型应该是 _Bool、有符号 >int、无符号整数或其他一些实现定义的类型的合格或非合格版本。”

但是,我今天遇到了一些代码,它显示了一个枚举作为类型,就像这样。

typedef enum
{
    a = 0,
    b = 1
}ENUM;

typedef struct
{
    ENUM id : 8;
}STRUCT;

没有评论或文档,很难说出意图。谁能提供一些见解?

4

1 回答 1

4

a并且b都是int类型,signed int。它的长度为32 位,即 4 字节。

但是枚举ENUM不需要那么多。

0000000000000000000000000000000 equals a
0000000000000000000000000000001 equals b

所以创造者想到了用8 bit的长度,最小长度 1 Byte来制作一个ENUM更短的。intbitfield

00000000 or 00000001

不过,他本可以char从一开始就采用长度为 1 字节的类型。

在某些编译器上,您可以激活一项功能以确保枚举可以小于 int。使用 GCC 的 --short-enums 选项,使其使用仍然适合所有值的最小类型。


这是一个如何使用位域节省内存的示例。您会看到someBits结构小于twoInts结构。

#include "stdio.h"

struct oneInt {
  int x;
};

struct twoInts {
  int x;
  int y;
};

struct someBits {
  int x:2; // 2 Bits
  int y:6; // 6 Bits
};


int main (int argc, char** argv) {
  printf("type int = %lu Bytes\n", sizeof(int));
  printf("oneInt = %lu Bytes\n", sizeof(struct oneInt));
  printf("twoInts = %lu Bytes\n", sizeof(struct twoInts));
  printf("someBits = %lu Bytes\n", sizeof(struct someBits));
  return 0;
}

输出:

type int = 4 Bytes
oneInt = 4 Bytes
twoInts = 8 Bytes
someBits = 4 Bytes
于 2013-11-01T10:11:57.270 回答