在C中bool(boolean)占用了多少空间?它是1位,1字节还是别的什么?程序是32位还是64位是否重要?
答案 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的例程以相互递归的方式相互调用。)
值得注意的几点:
我不太了解C99或更高版本的C或C ++标准,以了解它们是否具有任何没有地址的独立位类型的概念。我想不出任何理由这样的事情是不可能的,特别是标准已经认识到像结构位字段这样的概念,它的行为很像左值但没有地址。一些链接器可能不支持这样的变量,但是这样的链接器可以通过使它们的实际大小依赖于实现来适应(实际上,除了程序速度或总内存使用量之外,不可能判断这些变量是否被赋予1位或64位每个)。
答案 3 :(得分:1)
布尔值的确切大小将是特定于编译器的,但始终至少为一个字节。
答案 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个布尔值。