代码之家  ›  专栏  ›  技术社区  ›  Jérôme

为什么BoOL是8位长?

  •  125
  • Jérôme  · 技术社区  · 14 年前

    在C++中,我想知道为什么BoL类型是8位长(在我的系统上),其中只有一个比特足以容纳布尔值?

    我过去认为这是出于性能原因,但是在32位或64位的机器上,寄存器的宽度是32或64位,性能优势是什么?

    还是仅仅是这些“历史”原因之一?

    6 回复  |  直到 6 年前
        1
  •  210
  •   Stack Overflow is garbage    14 年前

    因为每个C++数据类型必须是可寻址的。

    如何创建指向单个位的指针?你不能,但是你 可以 创建指向字节的指针。因此,C++中的布尔值通常是字节大小的。(也可能更大。这取决于实现。最主要的是它必须是可寻址的,所以没有C++数据类型可以比字节小。

        2
  •  38
  •   Stephen Roantree    14 年前

    内存是字节可寻址的。如果不移动或屏蔽从内存中读取的字节,就无法寻址单个位。我想这是一个很大的原因。

        3
  •  18
  •   jldupont    14 年前

    boolean 正常型 遵循可寻址存储器的最小单位 目标机器(即通常为8位字节)。

    对内存的访问总是以“块”(多个单词,这是为了 硬件级别的效率 ,总线事务):在大多数CPU系统中,布尔位不能“单独”寻址。当然,一旦数据包含在 登记 ,通常有专门的指令来独立地操作位。

    因此,使用 “比特包装” 为了提高使用“布尔”基数据类型的效率。一种技术,如 enum (在C语言中)2次编码是一个很好的例子。在大多数语言中也有同样的技巧。

    更新的 :由于一次精彩的讨论,我注意到 sizeof(char)==1 通过 定义 在C++中。因此,“布尔”数据类型的寻址与可寻址内存的最小单元(加强了我的观点)非常相关。

        4
  •  6
  •   Benjamin Oakes    14 年前

    关于8位是可寻址的最小内存量的答案是正确的。但是,有些语言 可以 在某种程度上,使用1位作为布尔值。我似乎记得帕斯卡将集合实现为位字符串。也就是说,对于以下集合:

    {1, 2, 5, 7}
    

    您可能在内存中有这个:

    01100101
    

    当然,如果你想要的话,你可以在C/C++中做类似的事情。(如果你在跟踪一堆布尔人, 能够 有道理,但这取决于具体情况。)

        5
  •  1
  •   Cire    11 年前

    我知道这是旧的,但我想我会投入我的2美分。

    如果您将布尔值或数据类型限制为一位,那么您的应用程序将面临内存中断的风险。如何处理内存中只有一个位长的错误统计信息?

    我去参加了一次面试,项目负责人对我说的一句话是:“当我们发送发射导弹的信号时,我们只需通过无线发送一个简单的一点开一点关。”发送一个比特的速度非常快,我们需要尽可能快的发送该信号。”

    好吧,这是一个测试,看我是否理解概念、位、字节和错误处理。一个坏人发一点味精多容易啊。或者如果在传输过程中比特被反方向翻转会发生什么。

        6
  •  1
  •   EBlake    9 年前

    一些嵌入式编译器具有用于位封装布尔标志的int1类型(例如用于微芯片MPU的c c s系列c编译器)。设置、清除和测试这些变量使用单指令位级指令,但编译器不允许任何其他操作(例如获取变量的地址),原因见其他答案。