bool在记忆中如何表现?

时间:2013-10-13 23:26:19

标签: c++ types boolean

如前所述in the docsbool数据类型占用至少一个字节的内存。在之前问过类似的问题(How a bool type variable is stored in memory? (C++)),但是这个讨论和文档似乎只讨论了布尔数据类型占用的空间量,而不是实际发生在内存中的 当我这样做时:

bool b = true;

那么在记忆中究竟发生了什么? 7位未用于存储此信息的情况会怎样?标准是否规定了此行为?

它们未定义吗?或者在C ++总部做过这样的人:

enum bool : char 
{
  false = 0,
  true = 1
};

4 个答案:

答案 0 :(得分:11)

标准规定bool值表现为整数类型,但它没有在内存中指定它们的具体表示:

bool类型的值为truefalse。如下所述,bool值表现为整数类型。{{1}的值参加整体促销“ ~C ++ 033.9.1§6

“整数类型的同义词是整数类型。整数类型的表示应使用纯二进制计算系统定义值” ~C ++ 033.9.1§7

然而,它定义了从boolbool的整体推广:

“类型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),但不经常使用它。