繁体   English   中英

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

[英]Can a C++ compiler represent bool internally with something other than 0 or 1?

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

  1. 当类型转换为 int 时,C/C++ bool 类型是否总是保证为 0 或 1?

  2. c ++ bool问题

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

换种说法,下面的代码是否可以返回 0 或 1 以外的其他值?

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

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

编辑:我刚刚发现了一个几乎相同的问题,所以我将它链接到这里以获取更多信息。 布尔值如何在内存中表示? 感谢您的回答。

只要1==(int)true0==(int)false ,编译器就可以表示 true

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

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

[basic.fundamental]/6:

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

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

但是,以下规则适用于x86_64 处理器特定的 ABI

布尔值在存储在内存对象中时,存储为单字节对象,其值始终为 0(假)或 1(真)。 当存储在整数寄存器中或作为参数传递到堆栈时,寄存器的所有 8 个字节都是有效的; 任何非零值都被认为是真的。

该 ABI 的值将为0false ,任何为true 在这种情况下,不能保证从您的函数返回哪个值。

这个问题有两个部分:

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

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

2)标准怎么说?

  • 没有任何保证!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM