【问题标题】:In C how much space does a bool (boolean) take up? Is it 1 bit, 1 byte or something else?在 C 中,一个布尔值(布尔值)占用多少空间?它是 1 位、1 字节还是其他?
【发布时间】:2011-12-22 06:50:29
【问题描述】:

在 C 中,一个 bool(布尔值)占用多少空间?它是 1 位、1 字节还是其他?程序是 32 位还是 64 位有关系吗?

【问题讨论】:

  • @Avinash:在 C99 中,有一个 _Bool,以及一个可以使用 bool 的标准库。
  • 大概是byte 你的意思是char
  • @David Heffernan bytechar 是类似的,octet 是 8 位
  • @jayjay 这就是我问这个问题的原因
  • @FuaZe 在 C99 中,byte 和 char 实际上是同义词。字节仅被定义为可寻址单元,由连续的位序列组成。字节的大小在 C 标准的任何地方都没有定义。如果您特别想引用 8 位,请使用八位字节(与所有网络 RFC 一样)。

标签: c boolean


【解决方案1】:

布尔值的确切大小取决于编译器,但始终至少为一个字节。

Why is a char and a bool the same size in c++?

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 我认为我的回答回答了这个问题,链接仅供参考。
【解决方案2】:

C 中最小的可寻址“事物”是char。 C 中的每个变量都必须有一个唯一的地址,因此您的 bool 不能小于该地址。 (请注意,char 并不总是 8 位)

【讨论】:

  • 逻辑上你是正确的。但是根据 cnicutar 的回答中的第 6.2.5 点,只有 1 位足以容纳 1 和 0。那么 1 位的大小也是如此吗?
  • 不,它至少是 1 个字节,否则 & 无法按要求运行。
【解决方案3】:

它通常占用一个字节(8 位)。我用来确保类型大小的常用代码是我认为它们遵循的。注释中的示例输出说我的 char 是 1 字节(8 位),bool 也是如此。

/**
 * using gcc, you can compile this with the following command:
 *   g++ -otype-sizes type_sizes.cpp
 * and then run with with
 *   ./type-sizes
 *
 * output on my 64bit linux machine follows. Note that
 * the not-so-primitive types are reporting size on
 * the stack (the actual data in on the heap and is
 * not reported by sizeof()). To get the "length" of
 * these you can use vector<>::size() or string::length().

bits in a single char: 8

Sizes of primitive types:
  char:        1
  bool:        1
  short:       2
  int:         4
  long:        8
  long long:   8
  float:       4
  double:      8
  long double: 16

  Not so primitive types:
    string(""): 8
    string("Hello, World!"): 8
    vector<int>(0): 24
    vector<int>(10): 24

 *
 **/

#include <climits>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    cout << "bits in a single char: " << CHAR_BIT << endl
    << endl
    << "Sizes of primitive types:\n"
    << "  char:        " << sizeof(char) << endl
    << "  bool:        " << sizeof(bool) << endl
    << "  short:       " << sizeof(short) << endl
    << "  int:         " << sizeof(int) << endl
    << "  long:        " << sizeof(long) << endl
    << "  long long:   " << sizeof(long long) << endl
    << "  float:       " << sizeof(float) << endl
    << "  double:      " << sizeof(double) << endl
    << "  long double: " << sizeof(long double) << endl
    << endl
    << "  Not so primitive types:\n"
    << "    string(\"\"): " << sizeof(string("")) << endl
    << "    string(\"Hello, World!\"): " << sizeof(string("Hello, World!")) << endl
    << "    vector<int>(0): " << sizeof(vector<int>(0)) << endl
    << "    vector<int>(10): " << sizeof(vector<int>(10)) << endl
    << endl;
}

【讨论】:

  • "char is 8 bytes" 不,我不这么认为。
【解决方案4】:

在旧的 C 标准中,没有定义这样的类型。然而,许多嵌入式微控制器包括特殊电路,以允许有效处理单位标志。有些允许对存储在任何地方的变量进行此类处理,而另一些则只允许对存储在特定内存区域中的变量进行处理。此类处理器的编译器允许将静态持续时间的各个变量声明为“位”类型;此类变量通常只占用一位存储空间(如有必要,在可容纳此类使用的区域内分配)。一些编译器将允许将非递归例程的自动变量声明为“位”类型,但会默默地将它们视为“静态”(此类编译器提供的链接器要求例程识别它们调用的其他例程,并将拒绝程序其中未标记为可重入的例程以相互递归的方式相互调用)。

值得注意的几点:

  1. 其编译器支持“真”位变量的处理器通常可以更快地设置、清除或分支这些变量的值,并且使用更少的代码来设置、清除或分支字节宽标志;
  2. 许多这样的处理器具有非常少量的 RAM。在许多处理器上,单个变量(不同于数组元素或结构字段)是否占用一个位或一个字节的问题并不值得担心。然而,在具有 25 字节内存的处理器上,有 16 个标志每个占用一个字节与将所有 16 个标志组合成两个字节之间存在巨大差异。
  3. 至少在我见过的编译器上,位变量不能用作结构字段或数组元素,也不能使用一个地址。

我对 C99 或更高版本的 C 或 C++ 标准了解不足,无法知道它们是否有任何没有地址的独立位类型的概念。我想不出任何理由这样的事情是不可能的,特别是标准已经认识到结构位域之类的东西的概念,它的行为很像左值但没有地址。一些链接器可能不支持这些变量,但是可以通过使它们的实际大小依赖于实现来适应这些链接器(实际上,除了程序速度或总内存使用量之外,无法判断这些变量是 1 位还是 64 位每个)。

【讨论】:

    【解决方案5】:

    如果你指的是C99_Bool试试:

    printf("%zu\n", sizeof(_Bool)); /* Typically 1. */
    

    注意标准说:

    6.2.5

    声明为_Bool 类型的对象大到足以存储值 0 和 1.

    大小不能小于一个字节。但是大于一个字节是合法的。

    【讨论】:

    • 你可以创建一个包含 8 个布尔值的字节吗?还是一个 8 位的压缩结构?
    • @FuaZe:你可以有一个 8 位的字节;并使用 each 来表示布尔值,但这不能满足 _Bool 的要求。特别是,不可能获取该字节的单个元素的地址;和sizeof (_Bool[N]) != sizeof (_Bool) * N
    • 那么它的大小是 1 位?因为 1 位可以容纳 0 和 1
    • 链接到标准?
    • @Paul: typedef struct { _Bool b0 : 1; _Bool b1: 1; [...] _Bool b7 : 1; } BoolField; 允许您在 1 个字节中创建 8 个布尔值。 .. 不过没用过。
    【解决方案6】:

    这取决于您的编译器。有些会占用 1 个字节,有些会占用 int 的大小(有时 bool 只是 typedef 或 int 的#define)。我什至认为 bool 是一个短的。

    但是不要指望它会有点。任何指针都必须可以转换为 void* 然后返回并保持相同的值,这使得这不可能,因为 void* 寻址字节。顺便说一句,这是无法处理单个字段(如 int myvalue:2)的原因之一。

    32 位或 64 位通常没有区别,因为 32 位或 64 位与指针大小有关。

    【讨论】:

      【解决方案7】:

      不管你是32位还是64位,那是处理器指令的大小,完全不同。

      bool 需要 1 位,因为您只需要 2 个不同的值。但是,当您执行 sizeof(bool) 时,它会返回 1,即 1 个字节。出于实际原因,剩余的 7 位被填充。

      您不能存储大小小于 1 字节的变量。

      -> bool 占 1 个字节

      【讨论】:

      • sizeof(bool) 通常返回1,但并非在所有平台上。其余位(最常见的是 71531)应为 0,否则 bool 的值既不是 true 也不是 false,读取它是未定义的行为。
      • @ÖöTiib 类型的表示是实现定义的;编译器可能需要填充位为 1;或允许它们成为任何东西
      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 2015-12-22
      • 2014-02-13
      相关资源
      最近更新 更多