我的理解是位字段声明符的类型应该是某种 int 类型。事实上,这里是来自 C99 标准的行
“位域的类型应该是 _Bool、有符号 >int、无符号整数或其他一些实现定义的类型的合格或非合格版本。”
但是,我今天遇到了一些代码,它显示了一个枚举作为类型,就像这样。
typedef enum
{
a = 0,
b = 1
}ENUM;
typedef struct
{
ENUM id : 8;
}STRUCT;
没有评论或文档,很难说出意图。谁能提供一些见解?
我的理解是位字段声明符的类型应该是某种 int 类型。事实上,这里是来自 C99 标准的行
“位域的类型应该是 _Bool、有符号 >int、无符号整数或其他一些实现定义的类型的合格或非合格版本。”
但是,我今天遇到了一些代码,它显示了一个枚举作为类型,就像这样。
typedef enum
{
a = 0,
b = 1
}ENUM;
typedef struct
{
ENUM id : 8;
}STRUCT;
没有评论或文档,很难说出意图。谁能提供一些见解?
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