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

时间:2011-11-04 18:35:43

标签: c boolean

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

10 个答案:

答案 0 :(得分:18)

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

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

注意标准说:

  

6.2.5

     

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:3)

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

值得注意的几点:

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

这取决于你的编译器。一些将占用1个字节,一些是int的大小(有时bool只是一个int的typedef或#define)。我甚至把布尔看作短暂的。

然而,不要指望它有点。任何指针都必须被转换为void *然后返回并保持相同的值,这使得不可能因为void * address bytes。顺便说一句,这就是为什么单个字段(如int myvalue:2中)无法解决的原因之一。

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

答案 5 :(得分:0)

通常占用一个字节(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;
}

答案 6 :(得分:-1)

C确实有一个 bool ,但通常使用字节大小的存储(即char)进行模拟。 http://cboard.cprogramming.com/c-programming/109520-bool-c.html

答案 7 :(得分:-1)

对于那些说您只能存储1位的人,可以使用位集。位集是一种特殊类型的数据结构,它存储的每个位只有1位而不是1个字节。它将其存储在堆栈存储器中,因此,您必须为其定义大小。进一步了解here

答案 8 :(得分:-2)

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

一个bool实际上是1位,因为你只需要2个不同的值。但是,当你执行sizeof(bool)时,它返回1,表示1个字节。出于实际原因,剩下的7位是填充的。

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

- &GT; bool占用1个字节

答案 9 :(得分:-4)

没有布尔类型。分支时,值为零,其他值为true。

c中最小的类型是char,几乎在每个系统上占用一个字节。可以使用char的位来存储8个布尔值。