在C语言中,一个布尔值(boolean)占用了多少空间?它是1位、1字节还是别的什么?

gdx19jrr  于 2023-08-03  发布在  其他
关注(0)|答案(7)|浏览(218)

在C语言中,一个布尔值(boolean)占用了多少空间?它是1位、1字节还是别的什么?程序是32位还是64位有关系吗?

lnlaulya

lnlaulya1#

本文中对标准的所有引用均指ISO C17
下面的代码将显示一个布尔值的大小,如果这是最小的可寻址单元,则它必须至少为1:

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

字符串
标准(6.2.5 Types,尽管这也是回到C99的情况)声明:
声明为类型**_Bool的对象足够大,可以存储值0和1。
如前所述,大小不能 * 小于 * 一(1),但它可以法律的地大于,如标准第6.7.2.1 Structure and union specifiers节脚注124所支持的,特别注意“至少”部分:
虽然
_Bool对象中的位数至少为CHAR_BIT,但_Bool**的宽度(符号和值位的数量)可能仅为1位。

uqzxnwby

uqzxnwby2#

C语言中最小的可寻址对象是char。C中的每个变量都必须有一个唯一的地址,因此bool不能小于这个值。(注意char并不总是8位)

8ehkhllq

8ehkhllq3#

在较早的C标准中,没有定义这样的类型。然而,许多嵌入式微控制器包括特殊电路以允许有效地处理单比特标志;一些允许对存储在任何地方的变量进行这种处理,而另一些仅允许对存储在存储器的特定区域中的变量进行这种处理。用于这种处理器的编译器允许将静态持续时间的各个变量声明为类型“bit”;这样的变量通常只占用一位存储(如果需要,在可以容纳这样的使用的区域内分配)。一些编译器将允许非递归例程的自动变量被声明为“位”类型,但是将默默地将它们视为“静态”(与这样的编译器一起提供的链接器要求例程标识它们调用的其他例程,并且将拒绝其中未被标记为可重入的例程以相互递归的方式彼此调用的程序)。
有几点值得注意:
1.其编译器支持“真”位变量的处理器通常可以比它们可以在字节宽标志上设置、清除或分支更快地并且用更少的代码来设置、清除或分支这些变量的值;
1.许多这样的处理器具有非常少量的RAM。在许多处理器上,单个变量(与数组元素或结构字段不同)是占用一个位还是一个字节的问题不值得担心。然而,在一个具有25字节内存的处理器上,16个标志每个占用一个字节与所有16个标志合并为两个字节之间存在巨大差异。
1.至少在我见过的编译器上,位变量不能用作结构字段或数组元素,也不能取一个的地址。
我对C99或更高版本的C或C++标准的了解不够,不知道它们是否有任何没有地址的独立位类型的概念。我想不出有什么理由这样的事情不应该是可能的,特别是标准已经认识到像结构位字段这样的概念,它的行为很像左值,但没有地址。一些连接器可能不支持这样的变量,但是这样的连接器可以通过使它们的实际大小依赖于实现来适应(实际上,除了程序速度或总存储器使用之外,不可能分辨这样的变量是每个被给予1位还是64位)。

nzkunb0c

nzkunb0c4#

不管你是在32位还是64位,这是处理器指令的大小,完全不同的问题。
一个bool接受1个真实的位,因为你只需要2个不同的值。但是,当你执行sizeof(bool)时,它返回1,意味着1个字节。出于实际原因,填充剩余的7位。
你不能存储小于1字节的变量。
-> bool占用1个字节

eufgjt7s

eufgjt7s5#

布尔值的确切大小将是特定于编译器的,但总是至少为一个字节。
Why is a char and a bool the same size in c++?

ne5o7dgx

ne5o7dgx6#

这取决于你的编译器。有些将占用1个字节,有些大小为int(有时bool只是int的typedef或#define)。我甚至认为布尔是个空头。
但是不要期望它是一点。由于void* 寻址字节,所以任何指针都必须能够被投射到void*,然后返回并保持相同的值,这使得这是不可能的。顺便说一句,这就是为什么单个字段(如int myvalue:2)不能被寻址的一个原因。
在32或64构建中通常没有区别,因为32或64位与指针大小有关。

khbbv19g

khbbv19g7#

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

字符串

相关问题