最小的数据类型 – 我可以定义一位变量吗?

我只需要一位来表示我的数据 – 1或0.在C中这样做的最佳方法是什么? “正常”数据类型太大。

你可以创造

typedef struct foo { unsigned x:1; } foo; 

你告诉编译器你只使用一位x

但是由于结构打包安排(C标准是有意灵活的,以便编译器可以根据机器架构进行优化),很可能会发现这仍然占用了内存中与常规unsignedfoo数组相同的空间。不一定是按位连续的。

如果您真的想要,可以使用成员变量创建一个结构, 位为1位。

请记住,成员变量的数据类型需要是unsigned ,因为您需要存储01

如果您不需要数百万个这样的标志或者内存限制非常有限,那么最好的方法肯定是int

这是因为int通常对应于平台的自然字大小,并且可以快速访问正确对齐的内容。 无论如何,机器一次读取一个字,并且使用单个位需要屏蔽和移位,这需要花费时间。 在具有千兆字节RAM的典型PC上,这将是愚蠢的。

如果内存消耗确实存在问题,则存在位域结构。

可移植方式是变量的定义,其中各个位用作标志。

  #define FLAG_FOO 0 #define FLAG_BAR 1 // in case platform does not support uint8_t typedef unsigned char uint8_t; uint8_t flags; void flag_foo_set() { flags |= (1 << FLAG_FOO); } void flag_foo_clr() { flags &= ~(1 << FLAG_FOO); } uint8_t flag_foo_get() { return flags & (1 << FLAG_FOO); } 

虽然与C位字段相比,这似乎是超级流行的。 它几乎可以移植到每个ANSI C编译器。

通常,C中最小的可寻址数据块是一个字节。 您不能指向某个位,因此您无法声明1位大小的变量。 但正如Sourav Ghosh已经指出的那样,你可以声明位域,直接访问一位。