布尔值的最小大小是多少?
What is the minimum size of a boolean?
我正在研究 Stanley B. Lippman 在 C++ Prime 中的算术类型。当作者谈到 整数类型 和每个类型的大小时,例如 char 是 8 位,我注意到布尔值的最小大小并不是那么清楚。考虑类型转换,代码如下:
bool b = 42; // b is true
int i = b; // i had value 1
我可以说布尔值具有与整数相同的最小大小(通常为 16 位),因为如果它为假,则为 0,即一个整数,如果为真,则为 1,另一个整数?如果我说的不对,布尔值的最小大小是多少?
不,你不能。
布尔值具有不同的大小。有时 Int 可以被视为布尔值,因为 0,1 但这并不意味着布尔值与 Int 具有相同的大小。
Can I say that booleans have the same minimum size of an integer
不,如果可以的话,它会在标准中。
出于速度原因,现代系统 (x86/x64) 上的大多数标准实现使用 bool
与寄存器(分别为 32/64 位)大小相同。然而,没有什么能阻止您拥有位大小的 bool
变量,它们只是一个简单的位域!在微控制器实现上,bool
通常尽可能小(一个字节),因为您的内存非常有限。
如果您的代码中有 bool b = 42;
,编译器会发现 42
不是 bool
类型,如果它是 bool b = true;
则会将其视为类型。
当您稍后编写 int i = true
时,编译器将再次发现 true
不是整数,并将其视为 int i = 1
,因为根据定义,0
是 false
并且每隔一个 int 是 true
.
但是,谈论类型的大小是另一回事。 bool
的大小将始终至少为 8bit
s,因为这就是地址的工作方式。
bool
最少占用 1 个字节。即使只有true
或false
两个选项,也不能是1位,因为bool
需要是可寻址的。
What is the minimum size of a boolean?
在标准中你可以阅读 5.3.3:
The result of sizeof applied to any other fundamental type (3.9.1) is
implementation-defined. [ Note: in particular, sizeof(bool), sizeof(char16_t), sizeof(char32_t), and
sizeof(wchar_t) are implementation-defined.75 —end note ]
并注意:
sizeof(bool) is not required to be 1
所以它可能是 1 个字节,但也可能是 4 个字节。标准还允许整数的大小为 1 字节 16 位:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
因此 bool 的最小大小为 1 个字节,与 int 相同。另一个问题是您是否会找到具有 1 字节 int
类型的平台。
[编辑]
int
的最小大小(保证最小值)是 16 位,这 size guarantee for integral/arithmetic types in C and C++ 解释了原因。
在 c99 标准 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf) 中,整数被定义为跨越 至少 范围 [-32767, 32767](参见第 5.2.4.2.1 节) ).但是,规范还说 (in 6.2.5 2)
An object declared as type _Bool is large enough to store the values 0
and 1.
这意味着规范绝不要求它们的大小相同。满足规范并不要求它们匹配。对于特定的实现来说,选择让它们具有相同的大小显然是可能的(尽管不太可能)。但这不是你 can/should 所依赖的。
您询问的“布尔值”的一般概念与 C++ 类型之间存在差异 bool
。
非位域的bool
最小为1字节,即sizeof(bool)
≥1。这个限制是因为一个字节是最小可寻址单元;任何 C++ 对象至少有 1 个字节。标准没有对bool
的大小设置任何上限,但实际上它不会大于单次内存读写操作所能处理的。
A boolean 变量是用于实现布尔概念的任何变量。周围有很多布尔类型,而不仅仅是 C++ 自己的 bool
。例如,在 Windows 编程中,您有一个超过一个字节的 BOOL
类型,并且在某些情况下可以通过任何非零值表示逻辑 true 。
并且在某些情况下,对于布尔值的集合,它们可以每个仅用 1 位来表示,例如在 std::bitset
或 std::vector<bool>
中(这是特殊情况项目类型 bool
以允许这样做)。或者,我相信,但我还没有检查是否支持 bool
类型的大小为 1 的位域。这些考虑意味着这个问题有点太模糊了,没有一个简单明了的答案。如果您问的是 sizeof(bool)
,它会更明确:仅 1 个或更多字节,具体取决于实现。
我正在研究 Stanley B. Lippman 在 C++ Prime 中的算术类型。当作者谈到 整数类型 和每个类型的大小时,例如 char 是 8 位,我注意到布尔值的最小大小并不是那么清楚。考虑类型转换,代码如下:
bool b = 42; // b is true
int i = b; // i had value 1
我可以说布尔值具有与整数相同的最小大小(通常为 16 位),因为如果它为假,则为 0,即一个整数,如果为真,则为 1,另一个整数?如果我说的不对,布尔值的最小大小是多少?
不,你不能。
布尔值具有不同的大小。有时 Int 可以被视为布尔值,因为 0,1 但这并不意味着布尔值与 Int 具有相同的大小。
Can I say that booleans have the same minimum size of an integer
不,如果可以的话,它会在标准中。
出于速度原因,现代系统 (x86/x64) 上的大多数标准实现使用 bool
与寄存器(分别为 32/64 位)大小相同。然而,没有什么能阻止您拥有位大小的 bool
变量,它们只是一个简单的位域!在微控制器实现上,bool
通常尽可能小(一个字节),因为您的内存非常有限。
如果您的代码中有 bool b = 42;
,编译器会发现 42
不是 bool
类型,如果它是 bool b = true;
则会将其视为类型。
当您稍后编写 int i = true
时,编译器将再次发现 true
不是整数,并将其视为 int i = 1
,因为根据定义,0
是 false
并且每隔一个 int 是 true
.
但是,谈论类型的大小是另一回事。 bool
的大小将始终至少为 8bit
s,因为这就是地址的工作方式。
bool
最少占用 1 个字节。即使只有true
或false
两个选项,也不能是1位,因为bool
需要是可寻址的。
What is the minimum size of a boolean?
在标准中你可以阅读 5.3.3:
The result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined. [ Note: in particular, sizeof(bool), sizeof(char16_t), sizeof(char32_t), and sizeof(wchar_t) are implementation-defined.75 —end note ]
并注意:
sizeof(bool) is not required to be 1
所以它可能是 1 个字节,但也可能是 4 个字节。标准还允许整数的大小为 1 字节 16 位:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
因此 bool 的最小大小为 1 个字节,与 int 相同。另一个问题是您是否会找到具有 1 字节 int
类型的平台。
[编辑]
int
的最小大小(保证最小值)是 16 位,这 size guarantee for integral/arithmetic types in C and C++ 解释了原因。
在 c99 标准 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf) 中,整数被定义为跨越 至少 范围 [-32767, 32767](参见第 5.2.4.2.1 节) ).但是,规范还说 (in 6.2.5 2)
An object declared as type _Bool is large enough to store the values 0 and 1.
这意味着规范绝不要求它们的大小相同。满足规范并不要求它们匹配。对于特定的实现来说,选择让它们具有相同的大小显然是可能的(尽管不太可能)。但这不是你 can/should 所依赖的。
您询问的“布尔值”的一般概念与 C++ 类型之间存在差异 bool
。
非位域的bool
最小为1字节,即sizeof(bool)
≥1。这个限制是因为一个字节是最小可寻址单元;任何 C++ 对象至少有 1 个字节。标准没有对bool
的大小设置任何上限,但实际上它不会大于单次内存读写操作所能处理的。
A boolean 变量是用于实现布尔概念的任何变量。周围有很多布尔类型,而不仅仅是 C++ 自己的 bool
。例如,在 Windows 编程中,您有一个超过一个字节的 BOOL
类型,并且在某些情况下可以通过任何非零值表示逻辑 true 。
并且在某些情况下,对于布尔值的集合,它们可以每个仅用 1 位来表示,例如在 std::bitset
或 std::vector<bool>
中(这是特殊情况项目类型 bool
以允许这样做)。或者,我相信,但我还没有检查是否支持 bool
类型的大小为 1 的位域。这些考虑意味着这个问题有点太模糊了,没有一个简单明了的答案。如果您问的是 sizeof(bool)
,它会更明确:仅 1 个或更多字节,具体取决于实现。