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?
我的印象是,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
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- 伪造事实↔false
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- QueryWorkingSet总是返回false
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 如何使用boost定义布尔类,可能的值应该是TRUE或FALSE?
- 如何编写一个接受如下断言消息的自定义断言函数:assert(false) << "assertio
- 具有自定义返回类型和"false"返回条件的函数?
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- 将 true 重新定义为 false 时的期望输出是多少,反之亦然
- C++中的内置类型bool或C中的stdbool.h类型将TRUE和FALSE定义为不是机器字的大小
- Is_copy_assignable()在定义拷贝赋值时返回false