首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果bool和_Bool占用内存中的一个字节,它们为什么只能存储0或1呢?

如果bool和_Bool占用内存中的一个字节,它们为什么只能存储0或1呢?
EN

Stack Overflow用户
提问于 2020-01-22 15:48:49
回答 4查看 1.1K关注 0票数 3

我阅读了这个问题的答案:为什么在c++中一个字符和一个bool大小相同?,并进行了一个实验,以确定_Boolbool内存中分配的字节大小(我知道boolstdbool.h_Bool的宏,但为了完整起见,我也使用了它) C中的对象,以及在我的实现LinuUbuntu12.4上的C++中的bool对象:

C组:

代码语言:javascript
运行
复制
#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;
}

输出:

代码语言:javascript
运行
复制
the size of bin1 in bytes is: 1
the size of bin2 in bytes is: 1

对于C++:

代码语言:javascript
运行
复制
#include <iostream>

int main()
{
    bool bin = 1;

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

    return 0;
}

输出:

代码语言:javascript
运行
复制
the size of bin in bytes is: 1 

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

我的问题是:

  • 为什么C中的bool_Bool类型的对象和C++中的bool类型的对象只能够存储01的值,如果它们在内存中占用一个字节,可以容纳256个值?

当然,它们的目的只是表示01truefalse的值,但是哪个单元或宏决定它只能存储01

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

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

*无意中,我的意思是:修改为“不可探测的手段”- 什么是“无法检测的意思”,它们如何改变C/C++程序的对象?或不适当的分配f.e。bool a; a = 25;

EN

Stack Overflow用户

发布于 2020-01-22 15:57:30

(回答C.)

但是哪个单元或宏决定它只能存储0或1?

在典型的C实现中,编译器实现了这一点。编译器决定(或设计)在操作_Bool值时使用哪些指令。它可以使用一个根据字节是零还是非零来设置条件代码的指令来测试一个_Bool,也可以用一个根据低位(例如)是零还是非零来设置条件代码的指令来测试它。C标准并没有对此提出任何要求。每个C实现都可以自由选择自己的实现。

如果布尔类型的值在内存中被意外地修改为更大的值,会发生什么情况?

这取决于C实现。如果实现测试的是零或非零,则可以将更大的值视为1。如果实现使用该值,则可以根据其低位来处理更大的值。如果实现根据具体情况使用不同的指令,则更大的价值可能在不同的情况下表现得不同。一个更大的价值也可能导致结果,否则将是荒谬的。例如,考虑到int x = 4;和一些通过写入内存而不适当地修改的_Bool yint z = x + y;可能将z设置为10,尽管如果y是正确的_Bool,则只有4或5是可能的。当您将类型的表示修改为表示由实现定义的适当值的位以外的东西时,生成的行为不是由C标准定义的,通常也不是由C实现定义的。

给布尔类型分配一个更大的值甚至是可能的和允许的吗?

不,赋值将右操作数转换为赋值表达式的类型(这是左操作数的类型,但作为值而不是lvalue除外)。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59863467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档