布尔值的最小大小是多少

What is the minimum size of a boolean?

本文关键字:多少 小大 布尔值      更新时间:2023-10-16

我在研究Stanley B.Lippman在C++Prime中的算术类型。当作者谈到积分类型以及它们中每一个的大小时,比如char是8位,我注意到布尔值的最小大小并不那么清楚。考虑类型转换,以及以下代码:

bool b = 42; // b is true
int i = b; // i had value 1

我可以说布尔值具有相同的整数(通常为16位(的最小大小吗?因为如果它为假,则为0,即一个int,如果它为真,则为1,即另一个int?如果我说的是错的,那么布尔值的最小大小是多少?

bool至少占用1个字节。即使只有truefalse两个选项,它也不能是1位,因为bool需要是可寻址的。

布尔值的最小大小是多少?

在标准中,您可以阅读5.3.3:

将sizeof应用于任何其他基本类型(3.9.1(的结果为实现定义。[注意:特别是sizeof(bool(、sizeof(char16_t(、sizeof(char32_t(和sizeof(wchar_t(是实现定义的。75——尾注]

注意:

sizeof(bool(不需要是1

所以它可能是1个字节,但也可能是4个字节。标准还允许int的大小1字节16bits:

1==sizeof(char(<=sizeof(短(<=sizeof(int(<=sizeof(长(<=的大小

所以bool的最小大小是1字节,与int的大小相同。另一个问题是,您是否会找到具有1字节int类型的平台

[编辑]

int的最小大小(保证最小值(是16位,C和C++中的积分/算术类型的这种大小保证解释了原因。

“布尔型”以及C++类型bool

不是比特字段的bool最小为1字节,即sizeof(bool)≥1.这个限制是因为字节是最小可寻址单元;任何C++对象都至少是1个字节。该标准对bool的大小没有任何上限,但在实践中,它不会大于单个存储器读写操作所能处理的大小。

布尔变量是用于实现布尔概念的任何变量。有很多布尔类型,不仅仅是C++自己的bool。例如,在Windows编程中,BOOL类型超过一个字节,在某些情况下,它可以通过任何非零值表示逻辑true

在某些情况下,对于布尔值的集合,它们可以分别用1位来表示,例如在std::bitsetstd::vector<bool>中(为了允许这种情况,对项目类型bool进行特殊大小写(。或者,我相信,但我还没有检查是否支持bool类型的大小为1的位字段。这些考虑意味着这个问题有点过于模糊,无法给出简单明了的答案。如果您询问sizeof(bool),它会更加明确:根据实现情况,只有1个或更多字节。

不,你不能。

布尔值具有不同的大小。有时Ints可以被视为布尔值,因为0,1,但这并不意味着布尔值的大小与Int相同。

我可以说布尔值具有与整数相同的最小大小吗

不,如果可以的话,它会在标准中。

出于速度原因,现代系统(x86/x64(上的大多数标准实现都使用与寄存器大小相同的bool(分别为32/64位(。然而,没有什么能阻止您拥有位大小的bool变量,它们只是一个简单的位字段!在微控制器实现中,bool通常尽可能小(单个字节(,因为您的内存非常有限。

在c99标准中(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)整数被定义为跨越至少范围[-3276732767](见5.2.4.2.1节(。然而,规范也规定(在6.2.5.2中(

声明为类型_Bool的对象足够大,可以存储值0和1。

这意味着,规范绝不要求它们的大小相同。满足规范并不需要它们匹配。对于一个特定的实现来说,选择它们具有相同的大小显然是可能的(尽管不太可能(。但这不是你可以/应该依赖的。

如果代码中有bool b = 42;,编译器会发现42不是bool类型,并将其视为bool b = true;
当您稍后编写时,int i = true编译器将再次发现,true不是整数,并将其视为int i = 1,因为根据定义,0false,每隔一个int是true

然而,谈论类型的大小是不同的。bool的大小将始终至少为8bit秒,因为地址就是这样工作的。