C++ Can a C++;编译器是否在内部用0或1以外的内容表示布尔?

C++ Can a C++;编译器是否在内部用0或1以外的内容表示布尔?,c++,C++,以下问题(和答案)表明布尔值在转换为int时将为0或1 我的问题是编译器是否可以在内部将值表示为其他内容(直到转换)。我模模糊糊地回忆起MSVC调试器显示表示布尔值的字节的数值,如果它不是0或1,我似乎记得有时会看到255(0xFF) 换言之,下面的代码是否可以返回0或1以外的内容 我目前正在使用一种二进制格式,该格式在结构中使用bool,看到的是255,而不是0和1 编辑:我刚才发现了一个几乎相同的问题,所以我将其链接到这里以获取更多信息。 谢谢你的回答。只要1==(int)true和0=

以下问题(和答案)表明布尔值在转换为int时将为0或1

  • 我的问题是编译器是否可以在内部将值表示为其他内容(直到转换)。我模模糊糊地回忆起MSVC调试器显示表示布尔值的字节的数值,如果它不是0或1,我似乎记得有时会看到255(0xFF)

    换言之,下面的代码是否可以返回0或1以外的内容

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

    编辑:我刚才发现了一个几乎相同的问题,所以我将其链接到这里以获取更多信息。
    谢谢你的回答。

    只要
    1==(int)true
    0==(int)false

    编译器满足这些要求的最简单方法是将
    false
    表示为所有零位,将
    true
    表示为最低有效位集,因为这样到
    int
    的“转换”就不涉及任何更改

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

    [基础.基本]/6:

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

    这是模糊的。该标准绝不要求
    false
    true
    在内存中对应
    0
    1
    (可能是另一种方式)。我们知道的是,表示形式显然没有改变,因此您将获得一致的结果

    但是,以下规则适用于:

    布尔值存储在内存对象中时,存储为单字节 对象的值始终为0(false)或1(true)。当 存储在整数寄存器中或作为参数在堆栈上传递,所有8 寄存器的字节是有效的;任何非零值都会被考虑 正确。


    对于
    false
    ,该ABI的值将为
    0
    ,对于
    true
    的值将为任何值。在这种情况下,无法保证函数将返回哪个值。

    此问题有两个部分:

    1) 编译器实际上做什么

    • 所有主要编译器当前都将false表示为0
    • 但是,有些编译器并不总是将true表示为1,
      而是来源所具有的任何价值,因此在
      bool ok=res;
      ok将具有res拥有的任何值
    2) 标准怎么说

    • 不保证

    我非常确定
    bool
    内存表示是实现定义的,我将尝试为此找到一个标准引用。
    bool
    s位字段是否有可能?您不是在回答您自己的问题吗?@filmor,“实现定义”意味着实现必须记录其选择,可能您的意思是未指定(无需记录)是的,它可以,但在实践中,您找不到使用0和1以外的任何东西的编译器。由于UB,可能会出现其他值。这对于x86 psABI是正确的(参见第13页,尽管它说所有位对于参数都是有效的,任何非零值都是真的),我不知道MS编译器是否使用了这种ABI。好吧,这些规则与x86无关:你可以在x86上编写不遵循这些规则的实现,你可以在所有其他遵循这些规则的系统上编写实现……这完全取决于你使用的ABI。@JonathanWakely啊,就是这样。我会纠正我的answer.Oops,对不起,我想说的是x86_64 psABI。Intel386 psABI似乎根本没有提到
    bool
    。嗯,你怎么能指望false被表示为0呢?@LightnessRacesinOrbit你不能,我重新制定了那部分
    int boolval(bool z) {
      return *(unsigned char *)&z;
    }