我阅读了这个问题的答案:为什么在c++中一个字符和一个bool大小相同?,并进行了一个实验,以确定_Bool和bool内存中分配的字节大小(我知道bool是stdbool.h中_Bool的宏,但为了完整起见,我也使用了它) C中的对象,以及在我的实现LinuUbuntu12.4上的C++中的bool对象:
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;
}输出:
the size of bin1 in bytes is: 1
the size of bin2 in bytes is: 1对于C++:
#include <iostream>
int main()
{
bool bin = 1;
std::cout << "the size of bin in bytes is: " << sizeof(bin);
return 0;
}输出:
the size of bin in bytes is: 1 因此,布尔类型的对象,无论是特定的C或C++,都占用内存中的1字节(8位),而不仅仅是1位。
我的问题是:
bool和_Bool类型的对象和C++中的bool类型的对象只能够存储0或1的值,如果它们在内存中占用一个字节,可以容纳256个值?当然,它们的目的只是表示0和1或true和false的值,但是哪个单元或宏决定它只能存储0或1。
另外,但不是我的主要问题:
*无意中,我的意思是:修改为“不可探测的手段”- 什么是“无法检测的意思”,它们如何改变C/C++程序的对象?或不适当的分配f.e。bool a; a = 25;。
发布于 2020-01-22 15:57:30
(回答C.)
但是哪个单元或宏决定它只能存储0或1?
在典型的C实现中,编译器实现了这一点。编译器决定(或设计)在操作_Bool值时使用哪些指令。它可以使用一个根据字节是零还是非零来设置条件代码的指令来测试一个_Bool,也可以用一个根据低位(例如)是零还是非零来设置条件代码的指令来测试它。C标准并没有对此提出任何要求。每个C实现都可以自由选择自己的实现。
如果布尔类型的值在内存中被意外地修改为更大的值,会发生什么情况?
这取决于C实现。如果实现测试的是零或非零,则可以将更大的值视为1。如果实现使用该值,则可以根据其低位来处理更大的值。如果实现根据具体情况使用不同的指令,则更大的价值可能在不同的情况下表现得不同。一个更大的价值也可能导致结果,否则将是荒谬的。例如,考虑到int x = 4;和一些通过写入内存而不适当地修改的_Bool y,int z = x + y;可能将z设置为10,尽管如果y是正确的_Bool,则只有4或5是可能的。当您将类型的表示修改为表示由实现定义的适当值的位以外的东西时,生成的行为不是由C标准定义的,通常也不是由C实现定义的。
给布尔类型分配一个更大的值甚至是可能的和允许的吗?
不,赋值将右操作数转换为赋值表达式的类型(这是左操作数的类型,但作为值而不是lvalue除外)。
https://stackoverflow.com/questions/59863467
复制相似问题