Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 布尔在内存中是如何表示的?_C++_Types_Boolean - Fatal编程技术网

C++ 布尔在内存中是如何表示的?

C++ 布尔在内存中是如何表示的?,c++,types,boolean,C++,Types,Boolean,如前所述,bool数据类型至少占用一个字节的内存。之前有人问过类似的问题(),但本次讨论和文档似乎只讨论布尔数据类型占用的空间量,而不是我这样做时内存中实际发生的情况: bool b=true 那么,记忆中到底发生了什么?存储此信息时未使用的7位会发生什么变化?标准是否规定了这方面的行为 它们是未定义的吗?或者C++总部的人做了这样的事情:< /P> enum bool : char { false = 0, true = 1 }; 标准没有规定布尔的二进制表示形式;它只是说,当转换

如前所述,
bool
数据类型至少占用一个字节的内存。之前有人问过类似的问题(),但本次讨论和文档似乎只讨论布尔数据类型占用的空间量,而不是我这样做时内存中实际发生的情况:

bool b=true

那么,记忆中到底发生了什么?存储此信息时未使用的7位会发生什么变化?标准是否规定了这方面的行为

它们是未定义的吗?或者C++总部的人做了这样的事情:< /P>
enum bool : char 
{
  false = 0,
  true = 1
};

标准没有规定布尔的二进制表示形式;它只是说,当转换为其他整数类型时,
true
bool将变为1,
false
bool将变为0


这当然意味着一个与您所说的实现在精神上类似的实现,在这种实现中,这种转换基本上没有ops或纯整数加宽(但请记住,
bool
被强制要求是一个基本类型,而不是枚举类型)。

标准没有强制要求bool的二进制表示;它只是说,当转换为其他整数类型时,
true
bool将变为1,
false
bool将变为0


当然,这建议了一个与您所说的精神类似的实现,在这种实现中,这种转换基本上不会变成ops或纯整数加宽(但请记住,
bool
被强制为基本类型,而不是枚举类型)。标准规定
bool
值的行为是整数类型,但它没有指定它们在内存中的具体表示:

“类型为
bool
的值为
true
false
。如下所述,
bool
值作为积分类型。类型为
bool
的值参与积分促销”~C++03 3.9.1§6

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

但它定义了从
bool
int
的整体提升:

“可以将
bool
类型的右值转换为
int
类型的右值,
false
变为零,
true
变为一。这些转换称为积分提升。”
~C++03 4.5§4-5

以及从其他类型转换为
bool


“零值、空指针值或空成员指针值将转换为
false
;任何其他值将转换为
true
~C++03 4.12§1

标准规定
bool
值作为整数类型,但未指定其在内存中的具体表示:

“类型为
bool
的值为
true
false
。如下所述,
bool
值作为积分类型。类型为
bool
的值参与积分促销”~C++03 3.9.1§6

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

但它定义了从
bool
int
的整体提升:

“可以将
bool
类型的右值转换为
int
类型的右值,
false
变为零,
true
变为一。这些转换称为积分提升。”
~C++03 4.5§4-5

以及从其他类型转换为
bool


< P> <强>“0值、空指针值或空成员指针值转换为<代码> false <代码>;其他任何值都转换为<代码>真< /代码>。“< /强> ~+c++ 03 4.12<1 < /p> < p>我没有在C++中编程,因为几个月,但AfAIR规则如下: 0-假; 任何不同于0的值-true;(默认为1,但如果从其他整数值转换为AFAIR,则ex2也将被视为true)

因此,你可以说C++在某种程度上浪费了内存(其他的),因为它只能使用一个比特,但是编译编译器更简单。p>


<> P> C++中也可以定义位字段,但它不经常使用。

< P>我在C++中没有程序,因为几个月,但AfAIR规则如下: 0-假; 任何不同于0的值-true;(默认为1,但如果从其他整数值转换为AFAIR,则ex2也将被视为true)

因此,你可以说C++在某种程度上浪费了内存(其他的),因为它只能使用一个比特,但是编译编译器更简单。p>


<>在C++中,你也可以定义位字段,但是它不经常使用。

你可以通过复制内存来测试这样的事情,忽略它是哪种类型。此程序读取
test\u bool
的原始内存值,并将其放入
test\u 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

您可以通过复制内存来测试这种情况,忽略它是哪种类型。此程序读取
test\u bool
的原始内存值,并将其放入
test\u 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

“C++总部”这个概念的可能重复让我发笑;它给我的印象是一个灰色的地方,到处都是满是灰尘的标准副本,数百名语言律师对STL和stdlib以及类似的诽谤提出质疑。[/OT]@DanielA.White我链接到了那篇文章,但它没有解决这个问题。我感兴趣的是内存中发生了什么,而不是它占用了多少空间以及在哪个平台上。@DanielA.White我编辑了这篇文章来澄清这一点。可能重复[OT]的“C++总部”的概念让我发笑;它给我的印象是一个灰色的地方,满是灰尘