我的印象bool
是 C 或 C++ 中的类型都是 typdef'ed 整数,因为它在机器级别(字的大小等等)“更容易”处理。但我只是做了一个sizeof
,令我惊讶的是,它们返回 1(字节)。这是正确的吗?好吧,根据我自己的简短实验,为什么一切都告诉我应该使用整数?
只是为了感兴趣,请参阅有关 C 的布尔数据类型的Wikipedia 文章。
我的印象bool
是 C 或 C++ 中的类型都是 typdef'ed 整数,因为它在机器级别(字的大小等等)“更容易”处理。但我只是做了一个sizeof
,令我惊讶的是,它们返回 1(字节)。这是正确的吗?好吧,根据我自己的简短实验,为什么一切都告诉我应该使用整数?
只是为了感兴趣,请参阅有关 C 的布尔数据类型的Wikipedia 文章。
C++11 规范,第 3.9.1 节 [basic.fundamental],第 6 段:
type
bool
的值为true
或false
。[注意:没有有符号、无符号、短或长布尔类型或值。— 尾注] bool 类型的值参与积分促销 (4.5)。
第 5.3.3 节 [expr.sizeof],第 1 段:
sizeof
运算符产生其操作数的对象表示中的字节数。操作数要么是一个表达式,它是一个未计算的操作数(第 5 条),要么是一个带括号的类型 ID。sizeof
运算符不应应用于具有函数或不完整类型的表达式、其基础类型在其所有枚举数被声明之前未固定的枚举类型、此类类型的括号名称或指定位的左值-字段。sizeof(char)
,sizeof(signed char)
并且sizeof(unsigned char)
是 1。sizeof
应用于任何其他基本类型(3.9.1)的结果是实现定义的。[注意:特别是 、sizeof(bool)
、sizeof(char16_t)
和sizeof(char32_t)
是sizeof(wchar_t)
实现定义的。(75) — 尾注]
脚注 (75) 说:
75)
sizeof(bool)
不需要为 1
脚注的存在表明sizeof(bool)
在他们需要提醒人们不一定如此的足够实现上等于 1。
在某些机器上,int
可能比字节大小的对象更容易处理。但是对于许多处理器来说,anint
并不比字节大小的整数更容易处理。由于一个字节占用的空间更少(至少如果你不把它贴在一个旁边int
以便编译器需要填充它),那么在某些情况下你这样做会受益。
我认为该标准没有说明它实际上必须是什么大小。编辑:正如评论所说,C++ 标准明确表示大小是实现定义的,不需要为 1(但也没有说它不能为 1)。该标准还说 a 的值bool
是true
or false
,但是如果你“使用”一个未初始化的 type 变量bool
,它是未定义的行为,它可能不是这些值。
有一些处理器(较旧的 Alpha,如果我的记忆正确的话,是 MIPS 的一些变体),其中字节“难以”处理(只有读取整个单词的指令,必须通过掩码来管理单个字节等)。int
在这些处理器上,有一个大小的类型是有意义的。如果这些机器上出现这种情况,我也不会感到惊讶。请记住,C 和 C++ 是允许类型根据特定架构上的“好”而改变大小的语言。
在 C 中:
bool
是扩展为的宏,_Bool
并且_Bool
是既不是unsigned int
,unsigned char
也不是 的类型int
。
例如,_Bool
有这个属性:
(_Bool) 0.5 == 1
并且其他标准整数类型都没有此属性。
C 标准只是说这_Bool
是一个足够大的无符号整数类型来存储值0
和1
. 此外,_Bool
对象至少CHAR_BIT
具有任何非位字段类型的对象。
关于 的大小_Bool
,通常1
(针对大小进行了优化),但在某些系统上,它的大小与字的大小相同(例如4
在某些32
位系统上)。
根据最新的 C 标准C11,<stdbool.h>
标头定义:
真的
展开为整数常数 1,
错误的
展开为整数常量 0