【问题标题】:What datatype does the result of a binary comparison reduce to?二进制比较的结果归结为什么数据类型?
【发布时间】:2013-01-17 21:57:22
【问题描述】:

如果没有 BOOL 数据类型这样的东西,请采取以下措施:

std::cout << (1>2); //<<-- prints 0

假设这个错误比较是 0,比较的结果会减少到什么数据类型 deos?进行快速谷歌搜索不会产生任何结果。我最好的猜测是它是unsigned char,因为它是最小的最基本数据类型,0 真正表示为0x00。我不想假设任何事情,因为我不确定 voodoo std::cout 对值做了什么以使其成为可打印字符。

【问题讨论】:

  • 没有BOOL,但是有bool

标签: c++ types comparison


【解决方案1】:

所有关系运算符(<><=>=)的结果类型为bool

运算符<(小于)、>(大于)、<=(小于或等于)和>=(大于或等于)都产生false或@ 987654331@。结果的类型是bool

bool 类型的对象的值是 truefalse。在积分提升下,bool 可以转换为 int,其中 false 变为 0true 变为1:

bool 类型的纯右值可以转换为int 类型的纯右值,false 变为 0,true 变为 1。

bool 是一个整数类型,标准说它是通过使用“纯二进制计数系统”来表示的。描述此表示的脚注还不清楚它如何映射到值truefalse,但您可以假设它们暗示0 的值表示将全部为0 位:

整数的位置表示,使用二进制数字 0 和 1,其中由连续位表示的值是相加的,从 1 开始,并乘以 2 的连续整数幂,可能最高的位除外位置。 (改编自美国国家信息处理系统词典。)

【讨论】:

  • 我认为bool 是一个typedef?
  • @hydroparadise,可能在 C 中使用 <stdbool.h>
  • 不,它是真正的类型。 BOOL 只是一个蹩脚的 WinAPI typedef,与任何事情都没有关系。
  • @hydroparadise 添加到我的答案中。
  • @sftrabbit: bool 是整数类型,因此需要使用“纯二进制表示”。但是 C++ 标准对此的定义是模糊的(与 C 标准相比,无论如何)。我不清楚作者是否真正考虑过脚注中的定义“以 1 开头”如何应用于bool。您会认为整数类型是具有整数值的类型,但不是。我们是否应该假设因为false 转换为 0,所以它“是”0,因此需要在对象表示的某处用一个明确的位表示?也许吧,但实际上并没有这么说。
【解决方案2】:

没有标准的BOOL 类型,但bool 是标准的基本类型:

[C++11: 3.9.1/6]: bool 类型的值是 truefalse[..]

至于你的关系比较的结果:

[C++11: 5.9/1]: 关系运算符从左到右分组。 [..] 操作数应具有算术、枚举或指针类型,或类型std::nullptr_t。运算符<(小于)、>(大于)、<=(小于或等于)和>=(大于或等于)都产生falsetrue结果类型为bool

请注意,这在 C 中不一样,其中没有内置类型 bool,并且关系比较的结果是类型 int

[C99: 6.5/8]:<(小于)、>(大于)、<=(小于或等于)和>=(大于或等于)的每个运算符都应产生1 如果指定的关系为真,0 如果为假。 结果的类型为int

【讨论】:

    【解决方案3】:

    C++ 标准,第 5.9 节 关系运算符,第 1 段说:

    结果的类型是bool

    【讨论】:

      【解决方案4】:

      这不是您问题的直接答案:

      正如这里所说,它是 c++ 中的 bool 和 c 中的 int,但你我认为你会想到的部分是 保存比较结果需要多少内存?

      • 如您所知,数据类型定义了要分配的内存量。

      • 1234563使用位数的项目,例如typedef unsigned char uint8;,而不是直接使用标准数据类型,因此很容易移植到另一个编译器/目标处理器
      • 你应该看看这个:Why is a char and a bool the same size in c++?

      • 您还应该查看http://www.cplusplus.com/doc/tutorial/variables 在“基本数据类型”部分下的每种数据类型及其大小和范围的表格,但他指出:

      Size 和 Range 列的值取决于编译程序的系统。上面显示的值是在 大多数 32 位系统。但对于其他系统,通用规范 是 int 具有系统架构建议的自然大小 (一个“单词”)和四种整数类型 char、short、int 和 long 必须 每个都至少和它前面的一样大,其中 char 是 总是一个字节的大小。这同样适用于浮点类型 float、double 和 long double,其中每个必须至少提供 比上一个精度高。

      • 正如 sftrabbit 在他的回答中关于标准所指出的那样,该标准足够抽象且不详细,因此我认为内存中 bool 的大小是特定于实现的,可能与 c++ 编译器不同,请查看 Nawazs 的回答在这里:How a bool type variable is stored in memory? (C++)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-24
        • 2015-09-22
        • 2019-12-05
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多