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

基本上我想创建一个数据类型uint1_t 。 这有可能吗?

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

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

你可以用它来接近它:

 typedef _Bool uint1_t; 

要么:

 #include  typedef bool uint1_t; 

但它会占用(至少)一个字节,即使布尔变量只存储值0或1, falsetrue 。 您还可以使用位字段:

 typedef struct { unsigned int x : 1; } uint1_t; 

但这也会占用(至少)一个字节,你需要使用.x来访问该值。

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

但是,存储大小( sizeof )小于一个字节的类型不存在。

不,这是不可能的,uint8_t是最小的数据类型。 在struct中你可以使用位字段,除了不可能只有1位的数据类型。

您可以创建的最小对象的sizeof == 1 。 那个对象的大小是CHAR_BIT ,几乎在你看过的每个平台上都是8。

因此,您可以创建的最小对象是int8_t aka char

您可以使用位域来将许多1位数编码成更大的对象,但这并不是解决您问题的方法。

你最接近的东西是使用位字段。 它们在struct中设置, struct每个字段确定其宽度。

例:

 struct foo { unsigned int bla :1; /* this uses only 1 bit */ } 

这种情况仍然“浪费” int的其他位,但如果你有其他字段,你可以有效地使用int每个位来表示一个布尔值

http://en.wikipedia.org/wiki/Bit_field

简短的回答是“不”; 除了位字段之外,所有类型都必须映射到整数个字节(如果它们都适合,则多个位字段将占用相同的字节)。

从马的嘴里 :

6.2.6类型的表示

6.2.6.1总则

1除本条款规定外,所有类型的陈述均未指明。

2除了位字段外,对象由一个或多个字节的连续序列组成,其数量,顺序和编码可以是显式指定的,也可以是实现定义的。

3存储在无符号位域中的值和unsigned char类型的对象应使用纯二进制表示法表示。 49)

4存储在任何其他对象类型的非位字段对象中的值由n × CHAR_BIT位组成,其中n是该类型对象的大小(以字节为单位)。 可以将该值复制到unsigned char [ n ]类型的对象中(例如,通过memcpy ); 生成的字节集称为值的对象表示 。 存储在位字段中的值由m位组成,其中m是为位字段指定的大小。 对象表示是比特字段包含在其中的可寻址存储单元中的m比特的集合。 具有相同对象表示的两个值(除了NaN之外)比较相等,但是比较相等的值可以具有不同的对象表示


49)使用二进制数字0和1的整数的位置表示,其中由连续位表示的值是加性的,以1开始,并且乘以2的连续积分幂,除了具有最高位置的位。 (改编自美国国家信息处理系统词典 。)一个字节包含CHAR_BIT位, unsigned char类型的值范围为0到2 CHAR_BIT − 1

8位是一种类型的最小尺寸。 如果您确实需要子字节存储,则可以使用位字段将多个“小”元素组合在一起。

然而,这很少是一个大问题。 机器有很多内存,很少需要担心这种内存浪费。

是的你可以创建一个位变量假设int a:1; 您可以为其分配值但无法扫描它。