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

时间:2014-08-12 15:19:05

标签: c

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

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

8 个答案:

答案 0 :(得分:17)

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

您可以通过以下方式处理:

typedef _Bool uint1_t;

或:

#include <stdbool.h>
typedef bool uint1_t;

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

原则上,您可以使用位字段:

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

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

包括Drew McGowenDraxFiddling Bits建议的修改。

答案 1 :(得分:6)

与某些人认为的相反, 是C99中一位的数据类型:它被称为_Bool。您还可以声明大小为1的位域。单个位在C中不可寻址的事实 not 意味着不能存在一位数据类型。该参数基本上是比较苹果到橘子。

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

您可以创建的最小对象具有sizeof == 1。该对象的大小为CHAR_BIT位,几乎在您所见过的每个平台上都是8位。

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

您可以使用位域来将许多1位数字编码为更大的对象,但这并不能完全解决您的问题。

答案 4 :(得分:2)

你最接近的事情就是使用位字段。它们在struct内设置,struct的每个字段确定其宽度。

示例:

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

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

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

答案 5 :(得分:1)

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

来自horse's mouth

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 的集合 比特字段包含在保持它的可寻址存储单元中。两个值(其他 比NaNs)具有相同的对象表示比较相等,但比较的值 等于可以具有不同的对象表示
49)使用二进制数字0和1的整数的位置表示,其中包含值 由连续位表示的是加法的,以1开始,并乘以连续的积分 2的幂,除了位置最高的位。 (改编自美国国民 信息处理系统字典。)一个字节包含CHAR_BIT位,以及值 类型unsigned char的范围为0到2 CHAR_BIT − 1

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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