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

时间:2015-08-15 20:50:21

标签: c++ c++11 boolean sizeof

我正在研究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?如果我说错了,布尔值的最小大小是多少?

5 个答案:

答案 0 :(得分:3)

您询问的“boolean”的一般概念与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个或更多字节,具体取决于实现。

答案 1 :(得分:1)

不,你不能。

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

答案 2 :(得分:1)

  

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

不,如果可以的话,它将符合标准。

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

答案 3 :(得分:1)

在c99标准(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)中,整数被定义为跨越至少范围[-32767,32767](参见第5.2.4.2.1节)。但是,规范也说(在6.2.5 2中)

  

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

这样做的含义是,规范绝不要求它们具有相同的大小。满足规范并不需要让它们匹配。对于特定实现来说,明显可能(尽管不太可能)选择使它们具有相同的大小。但是你不能/应该依赖它。

答案 4 :(得分:0)

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

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