我基本上想要创建一种数据类型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,false
或true
.
原则上,您可以使用位域:
typedef struct
{
unsigned int x : 1;
} uint1_t;
Run Code Online (Sandbox Code Playgroud)
但是这也会占用至少一个字节(可能和一个字节一样多unsigned int
;通常是4个字节),你需要.x
用来访问这个值.位字段的使用是有问题的(它们的大多数方面是实现定义的,例如保存它的存储单元将占用多少空间) - 不使用位字段.
包括Drew McGowen,Drax和Fiddling Bits建议的修正案.
相反,有些人认为,有是在C99一个比特的数据类型:这就是所谓的_Bool
.您还可以声明大小为1 的位域.单个位在C中不可寻址的事实并不意味着不能存在一位数据类型.这个论点基本上是将苹果与橙子进行比较.
但是,没有一种存储大小(sizeof
)小于一个字节的类型.