是否可以在C中创建长度为1位的数据类型

Aym*_*men 21 c

我基本上想要创建一种数据类型uint1_t.这甚至可能吗?

我知道bool数据类型的大小是一个字节.但是布尔值只需要一位.那么C基本上只使用一位用于布尔?如果是,那么它与其他七个有什么关系.在一个足够的情况下使用八位似乎是浪费空间.

Jon*_*ler 19

创建一个占据一位的类型是不可能的.C中最小的可寻址单元是char(根据定义,它是一个字节,通常但不一定是8位长;它可能更长,但不允许短于标准C中的8位).

你可以用它来接近它:

typedef _Bool uint1_t;
Run Code Online (Sandbox Code Playgroud)

要么:

#include <stdbool.h>
typedef bool uint1_t;
Run Code Online (Sandbox Code Playgroud)

但它会占用(至少)一个字节,即使布尔变量只存储值0或1,falsetrue.

原则上,您可以使用位域:

typedef struct
{
    unsigned int x : 1;
} uint1_t;
Run Code Online (Sandbox Code Playgroud)

但是这也会占用至少一个字节(可能和一个字节一样多unsigned int;通常是4个字节),你需要.x用来访问这个值.位字段的使用是有问题的(它们的大多数方面是实现定义的,例如保存它的存储单元将占用多少空间) - 不使用位字段.

包括Drew McGowen,DraxFiddling Bits建议的修正案.


The*_*ant 7

相反,有些人认为,有在C99一个比特的数据类型:这就是所谓的_Bool.您还可以声明大小为1 位域.单个位在C中不可寻址的事实并不意味着不能存在一位数据类型.这个论点基本上是将苹果与橙子进行比较.

但是,没有一种存储大小(sizeof)小于一个字节的类型.