C ++编译器可以在内部用0或1以外的东西表示bool吗?

时间:2014-12-06 22:09:46

标签: c++

以下问题(和答案)表明转换为int时bool的值为0或1。

  1. Is C/C++ bool type always guaranteed to be 0 or 1 when typecast'ed to int?

  2. c++ bool question

  3. 我的问题是编译器是否可以将值表示为内部的其他内容(直到转换)。我隐约回想起MSVC调试器显示表示bool的字节的数值,如果它不是0或1,我似乎记得有时看到255(0xFF)。

    不同地说,以下代码可以返回0或1以外的其他内容吗?

    int boolval(bool z) {
      return *(unsigned char *)&z;
    }
    

    我目前正在使用二进制格式,在结构中使用bool,我看到的是255而不是0和1。

    编辑:我刚刚发现了一个几乎完全相同的问题所以我在这里链接它以获取更多信息。 How is a bool represented in memory? 谢谢你的回答。

3 个答案:

答案 0 :(得分:7)

只要1==(int)true0==(int)false

,编译器就可以表示为true

编译器满足这些要求的最简单方法是将false表示为所有零位,并将true表示为最低有效位集,因为那时"转换"至int并不涉及任何改变。

但是编译器可以自由地将true表示为所有位设置,并在转换为1时发出将其转换为int的指令,甚至代表true作为所有位的所有零位和false或任何其他奇数表示,只要它满足要求。

答案 1 :(得分:4)

[basic.fundamental] / 6:

  

类型bool,[...]统称为整数类型。同义词   对于整数类型是整数类型。
积分的表示   类型应使用纯二进制计算系统定义值。

这很模糊。标准绝不要求falsetrue与内存中的01相对应(可能是相反的方式)。我们所知道的是,代表性显然不会改变,因此您将获得一致的结果。

但是,以下规则适用于x86_64 processor specific ABI

  

布尔值存储在内存对象中时,存储为单字节   对象的值始终为0(false)或1(true)。 :当   存储在整数寄存器中或作为参数传递到堆栈上,全部为8   寄存器的字节很重要;考虑任何非零值   真。

该ABI的值将为0的{​​{1}}以及false的任何值。在这种情况下,无法保证从您的函数返回哪个值。

答案 2 :(得分:0)

这个问题分为两部分:

1)编译器实际上做了什么?

  • 目前所有主要编译器都将false表示为0
  • 然而,有些编译器并不总是表示为1,
    但无论来源有什么价值,所以在 bool ok = res;确定将拥有res所具有的任何价值。

2)标准说什么?

  • 无保证!