2

我的印象bool是 C 或 C++ 中的类型都是 typdef'ed 整数,因为它在机器级别(字的大小等等)“更容易”处理。但我只是做了一个sizeof,令我惊讶的是,它们返回 1(字节)。这是正确的吗?好吧,根据我自己的简短实验,为什么一切都告诉我应该使用整数?

只是为了感兴趣,请参阅有关 C 的布尔数据类型的Wikipedia 文章。

4

4 回答 4

9

C++11 规范,第 3.9.1 节 [basic.fundamental],第 6 段:

typebool的值为truefalse。[注意:没有有符号、无符号、短或长布尔类型或值。— 尾注] 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。

于 2013-07-17T21:33:49.190 回答
7

在某些机器上,int可能比字节大小的对象更容易处理。但是对于许多处理器来说,anint并不比字节大小的整数更容易处理。由于一个字节占用的空间更少(至少如果你不把它贴在一个旁边int以便编译器需要填充它),那么在某些情况下你这样做会受益。

我认为该标准没有说明它实际上必须是什么大小。编辑:正如评论所说,C++ 标准明确表示大小是实现定义的,不需要为 1(但也没有说它不能为 1)。该标准还说 a 的值booltrueor false,但是如果你“使用”一个未初始化的 type 变量bool,它是未定义的行为,它可能不是这些值。

有一些处理器(较旧的 Alpha,如果我的记忆正确的话,是 MIPS 的一些变体),其中字节“难以”处理(只有读取整个单词的指令,必须通过掩码来管理单个字节等)。int在这些处理器上,有一个大小的类型是有意义的。如果这些机器上出现这种情况,我也不会感到惊讶。请记住,C 和 C++ 是允许类型根据特定架构上的“好”而改变大小的语言。

于 2013-07-17T21:27:00.767 回答
2

在 C 中:

bool是扩展为的宏,_Bool并且_Bool是既不是unsigned intunsigned char也不是 的类型int

例如,_Bool有这个属性:

(_Bool) 0.5  == 1

并且其他标准整数类型都没有此属性。

C 标准只是说这_Bool是一个足够大的无符号整数类型来存储值01. 此外,_Bool对象至少CHAR_BIT具有任何非位字段类型的对象。

关于 的大小_Bool,通常1(针对大小进行了优化),但在某些系统上,它的大小与字的大小相同(例如4在某些32位系统上)。

于 2013-07-17T21:35:35.610 回答
1

根据最新的 C 标准C11<stdbool.h>标头定义:

真的

展开为整数常数 1,

错误的

展开为整数常量 0

于 2013-07-17T21:27:02.423 回答