C++中的内置类型bool或C中的stdbool.h类型将TRUE和FALSE定义为不是机器字的大小

the built-in type bool in C++ or the stdbool.h type in C defines TRUE and FALSE as not the size of the machine word?

本文关键字:定义 FALSE 机器 TRUE 类型 bool 置类型 内置 C++ stdbool 中的      更新时间:2023-10-16

我的印象是,C或C++中的bool类型都是典型定义的整数,因为在机器级别(单词大小等)处理起来"更容易"。但我刚刚做了一个sizeof,令我惊讶的是,它们返回了1(字节)。这是对的吗?根据我自己的简短实验,为什么所有的东西都告诉我应该使用整数?

出于兴趣,请参阅维基百科上关于C.布尔数据类型的文章

C++11规范,第3.9.1节【basic.basic】,第6段:

类型bool的值是truefalse。[注:没有有符号、无符号、短布尔或长布尔类型或值。--尾注]布尔类型的值参与整体促销(4.5)。

第5.3.3节【expr.sizeof】,第1段:

sizeof运算符产生对象中的字节数其操作数的表示形式。操作数是表达式,它是未赋值的操作数(第5条),或带括号的类型id。sizeof运算符不应应用于表达式具有函数或不完整类型的枚举类型在所有枚举器都被固定之前,基础类型是不固定的声明的,为此类类型的带括号的名称,或为左值指定位字段。CCD_ 8、CCD_ 9和CCD_。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可能比字节大小的对象更容易处理。但对于许多处理器来说,int并不比字节大小的整数更容易处理。由于一个字节占用的空间较小(至少如果你不把它粘在int旁边,这样编译器就需要填充它),那么在某些情况下这样做会让你受益。

我认为该标准没有说明它实际上必须是什么大小。编辑:正如评论所说,C++标准特别指出,大小是由实现定义的,不需要是1(但也没有说不能是1)。该标准还规定,bool的值是truefalse,但如果"使用"类型为bool的未初始化变量,则它是未定义的行为,并且它可能不是这两个值。

有一些处理器(旧的Alpha,如果我的内存正常的话,MIPS的一些变体)的字节"很难"处理(只有读取整个单词的指令,单个字节必须通过屏蔽来管理,等等)。在这些处理器上,使用int大小的类型是有意义的。如果这些机器是这样的话,我也不会感到惊讶。记住,C和C++是允许类型根据特定体系结构上的"好"而大小不同的语言。

在C:中

bool是扩展到_Bool的宏,而_Bool是既不是unsigned intunsigned char也不是int的类型。

例如,_Bool具有以下属性:

(_Bool) 0.5  == 1

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

C标准只是说_Bool是一个无符号整数类型,其大小足以存储值01。此外,CCD_ 36对象至少具有CCD_ 37,如同任何非位字段类型的对象一样。

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

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

true

其扩展到整数常数1,

false

它扩展到整数常数0