是否可以在C中创建长度为1位的数据类型
基本上我想创建一个数据类型uint1_t
。 这有可能吗?
我知道bool数据类型的大小是一个字节。 但是布尔值只需要一位。 那么C基本上只使用一位用于布尔? 如果是,那么它与其他七个有什么关系呢。 在一个足够的情况下使用八位似乎是浪费空间。
创建一个占据一位的类型是不可能的。 C中最小的可寻址单元是char
(根据定义,它是一个字节,通常但不一定是8位长;它可能更长,但不允许短于标准C中的8位)。
你可以用它来接近它:
typedef _Bool uint1_t;
要么:
#include typedef bool uint1_t;
但它会占用(至少)一个字节,即使布尔变量只存储值0或1, false
或true
。 您还可以使用位字段:
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
每个位来表示一个布尔值
简短的回答是“不”; 除了位字段之外,所有类型都必须映射到整数个字节(如果它们都适合,则多个位字段将占用相同的字节)。
从马的嘴里 :
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到2CHAR_BIT − 1
。
8位是一种类型的最小尺寸。 如果您确实需要子字节存储,则可以使用位字段将多个“小”元素组合在一起。
然而,这很少是一个大问题。 机器有很多内存,很少需要担心这种内存浪费。
是的你可以创建一个位变量假设int a:1; 您可以为其分配值但无法扫描它。