为什么 bool 和 _Bool 在内存中占用 1 个字节只能存储 0 或 1?

Rob*_*rtS 3 c c++ memory memory-management boolean

我已经阅读了该问题的答案:为什么 c++ 中的 char 和 bool 的大小相同?并做了一个实验来确定内存中分配的字节大小 a_Bool和 a bool(我知道这bool是一个_Boolin的宏,stdbool.h但为了完整起见,我也使用了它)在 C 中的bool对象,以及在我的实现中的 C++ 中的对象Linux Ubuntu 12.4:

对于 C:

#include <stdio.h>
#include <stdbool.h>   // for "bool" macro.

int main()
{
    _Bool bin1 = 1;
    bool bin2 = 1; // just for the sake of completeness; bool is a macro for _Bool.    

    printf("the size of bin1 in bytes is: %lu \n",(sizeof(bin1)));
    printf("the size of bin2 in bytes is: %lu \n",(sizeof(bin2)));  

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

the size of bin1 in bytes is: 1
the size of bin2 in bytes is: 1
Run Code Online (Sandbox Code Playgroud)

对于 C++:

#include <iostream>

int main()
{
    bool bin = 1;

    std::cout << "the size of bin in bytes is: " << sizeof(bin);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

the size of bin in bytes is: 1 
Run Code Online (Sandbox Code Playgroud)

因此,布尔类型的对象,无论是 C 还是 C++,都在内存中占用 1 个字节(8 位),而不仅仅是 1 位。

我的问题是:

  • 为什么这些类型的对象bool以及_Bool在 C 和boolC++ 中只能存储01如果它们在可以容纳 256 个值的内存中占用 1 个字节的值?

当然,它们的目的是只表示0and1trueand的值false,但是哪个单元或宏决定它只能存储0or 1

另外,但不是我的主要问题:

  • 如果布尔类型的值在内存中*意外地修改为更大的值,因为它可以通过这种方式存储在内存中,会发生什么?

*不小心我的意思是:被“无法检测的手段”修改 -什么是“不可检测的手段”,它们如何更改 C/C++ 程序的对象?或不适当的 fe 分配bool a; a = 25;

dbu*_*ush 5

C 语言限制了可以存储在 a 中的内容_Bool,即使它有能力保存除 0 和 1 之外的其他值。

C 标准的第 6.3.1.2 节说明了以下关于转换为 的内容_Bool

当任何标量值转换为 时_Bool,如果该值比较等于 0,则结​​果为 0;否则,结果为 1。

C ++ 17标准具有第7.14类似的语言:

算术、无作用域枚举、指针或指向成员类型的指针的纯右值可以转换为 type 的纯右值bool。零值、空指针值或空成员指针值转换为 false;任何其他值都将转换为 true。对于直接初始化(11.6),类型的纯右值std::nullptr_t可以转换为类型的纯右值bool;结果值为假。

所以,即使你尝试给其他值的_Bool语言将值转换为0或1℃,到truefalse为C ++。如果您尝试_Bool通过指向不同类型的指针写入 a 来绕过此问题,则会调用undefined behavior


归档时间:

查看次数:

628 次

最近记录:

5 年,6 月 前