【问题标题】:How can I define a datatype with 1 bit size in C?如何在 C 中定义 1 位大小的数据类型?
【发布时间】:2014-03-30 05:19:11
【问题描述】:

我想在 C 中为布尔值 true/false 定义一个数据类型。有没有办法定义一个 1 位大小的数据类型来声明布尔值?

【问题讨论】:

  • 你知道你不能寻址少于一个字节,所以无论你做什么它都会消耗比一个位更多的内存(除非你自己将它与其他 7 个位配对)。
  • 如果我想定义一个 1 字节的数据类型,那么程序是什么?我不想使用 int 来表示布尔值。
  • 你见过别人代码中定义的布尔类型吗?现有的解决方案有问题吗?
  • 在现有解决方案中,布尔类型被定义为无符号字符。所以当我将此值放入条件运算符(if/else)时,它不起作用。
  • 分配不到1个字节是不可能的。

标签: c boolean bit declare


【解决方案1】:

也许你正在寻找一个位域:

struct bitfield
{
     unsigned b0:1;
     unsigned b1:1;
     unsigned b2:1;
     unsigned b3:1;
     unsigned b4:1;
     unsigned b5:1;
     unsigned b6:1;
     unsigned b7:1;
};

位域有这么多实现定义的功能,几乎令人难以置信,但struct bitfield 的每个元素都占用一个位。然而,结构的大小可能是 4 字节,即使您只将 8 位(1 字节)用于 8 位字段。

没有其他方法可以创建单个存储位。否则,C 提供字节作为最小的可寻址单元,并且一个字节必须至少有 8 位(历史上,有机器具有 9 位或 10 位字节,但现在大多数机器只提供 8 位字节——除非可能您在 DSP 上,其中最小的可寻址单元可能是 16 位数量)。

【讨论】:

【解决方案2】:

试试这个:

#define bool int
#define true 1
#define false 0

我认为使用int 类型的变量。这就是我们在 C 中所做的。例如:

int flag=0;
if(flag)
{
    //do something
}
else
{
    //do something else
}

编辑:

您可以指定位结构中的字段大小,以位为单位。但是,编译器会将类型四舍五入到最接近的字节,因此您什么都不保存,并且这些字段不可寻址,并且位字段中的位存储顺序是实现定义的。例如:

struct A {
  int a : 1; // 1 bit wide
  int b : 1;
  int c : 2; // 2 bits
  int d : 4; // 4 bits
};

位域只允许在结构内部。除了位域,任何对象都不能小于 sizeof(char)。

【讨论】:

  • 在 int 中需要 4 个字节。我想要 1 位声明。可以吗?
  • @NutBoltu - 自算盘以来我们一直在前进!
  • @EdHeal:没关系!他正在努力学习。事实上,我们都是:-)
【解决方案3】:

答案是 _Bool 或 bool。

C99 及更高版本有一个内置类型 _Bool,它保证足够大以存储值 0 和 1。它可能是 1 位或更大,它是一个整数。

他们还有一个库 include,它提供了一个扩展为 _Bool 的宏 bool,以及分别扩展为 1 和 0 的宏 true 和 false。

如果您使用的是较旧的编译器,则必须伪造它。

[编辑:感谢乔纳森]

【讨论】:

  • 从技术上讲,C99 和 C11 有一个内置类型 _Bool,它始终可用; <stdbool.h> 提供了一个宏 bool 扩展为 _Bool,宏 truefalse 分别扩展为 1 和 0,以及一个宏 __bool_true_false_are_defined 让您知道 <stdbool.h> 已包含在内.作为一项特殊特权,要在(遥远的)未来撤销,您可以取消定义和重新定义 booltruefalse 宏。
猜你喜欢
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2011-03-14
  • 2019-09-03
相关资源
最近更新 更多