在C中bool(布尔)占用了多少空间?它是1位,1字节还是别的什么?

use*_*891 19 c boolean

在C中bool(布尔)占用了多少空间?它是1位,1字节还是别的什么?程序是32位还是64位是否重要?

cni*_*tar 20

如果您指的是C99,请_Bool尝试:

printf("%zu\n", sizeof(_Bool)); /* Typically 1. */
Run Code Online (Sandbox Code Playgroud)

注意标准说:

6.2.5

声明为type的对象_Bool足以存储值0和1.

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

  • @FuaZe:你可以有一个8位的字节; 并使用each来表示一个布尔值,但这不符合`_Bool`的要求.特别是,不可能获取该字节的单个元素的地址; 和`sizeof(_Bool [N])!= sizeof(_Bool)*N`. (4认同)
  • @Paul:`typedef struct { _Bool b0 : 1; _布尔b1:1;[...] _Bool b7 : 1; } BoolField;` 允许您在 1 个字节中创建 8 个布尔值。..虽然从未使用过它。 (3认同)
  • 那么你可以制作一个包含 8 个布尔值的字节吗?还是一个 8 位的打包结构?<- 不确定,在某处听说过。对于字节,它需要一些位切换才能得到正确的值。(或者一些指令为此进行了优化?) (2认同)

Fle*_*exo 7

C中最小的可寻址"事物"是a char.C中的每个变量都必须有唯一的地址,因此bool不能小于此.(注意,char但并不总是8位)

  • 不,它至少是 1 个字节,否则 `&` 不能按要求运行。 (3认同)

BuZ*_*uZz 5

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

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

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

-> bool 占用1字节


sup*_*cat 5

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

有几点值得注意:

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

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