我的印象是,C或C++中的bool
类型都是典型定义的整数,因为在机器级别(单词大小等)处理起来"更容易"。但我刚刚做了一个sizeof
,令我惊讶的是,它们返回了1(字节)。这是对的吗?根据我自己的简短实验,为什么所有的东西都告诉我应该使用整数?
出于兴趣,请参阅维基百科上关于C.布尔数据类型的文章
C++11规范,第3.9.1节【basic.basic】,第6段:
类型
bool
的值是true
或false
。[注:没有有符号、无符号、短布尔或长布尔类型或值。--尾注]布尔类型的值参与整体促销(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
的值是true
或false
,但如果"使用"类型为bool
的未初始化变量,则它是未定义的行为,并且它可能不是这两个值。
有一些处理器(旧的Alpha,如果我的内存正常的话,MIPS的一些变体)的字节"很难"处理(只有读取整个单词的指令,单个字节必须通过屏蔽来管理,等等)。在这些处理器上,使用int
大小的类型是有意义的。如果这些机器是这样的话,我也不会感到惊讶。记住,C和C++是允许类型根据特定体系结构上的"好"而大小不同的语言。
在C:中
bool
是扩展到_Bool
的宏,而_Bool
是既不是unsigned int
、unsigned char
也不是int
的类型。
例如,_Bool
具有以下属性:
(_Bool) 0.5 == 1
并且其他标准整数类型都不具有此属性。
C标准只是说_Bool
是一个无符号整数类型,其大小足以存储值0
和1
。此外,CCD_ 36对象至少具有CCD_ 37,如同任何非位字段类型的对象一样。
关于_Bool
的大小,它通常是1
(针对大小进行优化),但在一些系统上,它的大小与字的大小相同(例如,在一些32
位系统上的4
)。
根据最新的C标准C11,<stdbool.h>
标头定义:
true
其扩展到整数常数1,
false
它扩展到整数常数0