如前所述in the docs,bool
数据类型占用至少一个字节的内存。在之前问过类似的问题(How a bool type variable is stored in memory? (C++)),但是这个讨论和文档似乎只讨论了布尔数据类型占用的空间量,而不是实际发生在内存中的 当我这样做时:
bool b = true;
那么在记忆中究竟发生了什么? 7位未用于存储此信息的情况会怎样?标准是否规定了此行为?
它们未定义吗?或者在C ++总部做过这样的人:
enum bool : char
{
false = 0,
true = 1
};
答案 0 :(得分:11)
标准规定bool
值表现为整数类型,但它没有在内存中指定它们的具体表示:
“bool
类型的值为true
或false
。如下所述,bool
值表现为整数类型。{{1}的值参加整体促销“ ~C ++ 033.9.1§6
“整数类型的同义词是整数类型。整数类型的表示应使用纯二进制计算系统定义值” ~C ++ 033.9.1§7 子>
然而,它定义了从bool
到bool
的整体推广:
“类型int
的左值可以转换为bool
类型的右值,int
变为零,false
变为一。这些转换称为整体促销。“ ~C ++ 034.5§4-5
以及从其他类型转换为true
:
“零值,空指针值或空成员指针值转换为bool
;任何其他值都转换为false
。” < / em> ~C ++ 034.12§1
答案 1 :(得分:5)
该标准没有强制要求bools的二进制表示;它只是说,当转换为其他整数类型时,true
布尔将变为1,false
布尔将变为0。
这当然表明了一种类似于你所说的实现的实现,其中这样的转换将基本上变为无操作或普通整数扩展(但请记住bool
被强制为基本类型,而不是枚举类型)。
答案 2 :(得分:3)
你可以通过复制内存来测试这样的东西,忽略它的类型。该程序读取test_bool
的原始内存值并将其放入test_int
,以便您可以打印它。
int test_int = 0;
bool test_bool;
test_bool = true;
memcpy (&test_int, &test_bool, sizeof(bool));
printf ("True value is: %d\n", test_int);
test_bool = false;
memcpy (&test_int, &test_bool, sizeof(bool));
printf ("False value is: %d\n", test_int);
对我来说,这个程序给出了:
True value is: 1
False value is: 0
答案 3 :(得分:-1)
我几个月没用C ++编程,但AFAIR规则如下: 0 - 错误; 任何不同于0的值 - 真; (默认情况下,它是1,但是如果你将其从其他整数值转换为AFAIR,例如2也将被视为真)。
因此,您可以说C ++在某种程度上浪费了内存(其他也是如此),因为它只能使用一个位,但是编程就更简单了。
在C ++中,您还可以定义位字段(bit fields in wikipedia),但不经常使用它。