C ++将bool转换为int - 标准

时间:2016-07-26 06:44:11

标签: c++ casting boolean

我很感兴趣,在将bool类型转换为integer类型之后,标准会说明#include <iostream> using namespace std; int main() { bool someValue=false; *((int*)(&someValue)) = 50; cout << someValue << endl; return 0; } 类型的可能值。

例如以下代码:

operator int(){
    return myValue !=0 ? 1 : 0;
}

打印1即使它被强制存储值50.标准是否指定了它的任何内容?或者是编译器为bool类型生成一些方法:

reinterpret_cast<int>(someValue) = 50;

同样为什么演员如下:

{{1}}

禁止错误

  

错误:类型&#39; bool&#39;输入&#39; int&#39;

(对于以上所有用户GCC 5.1编译器。)

2 个答案:

答案 0 :(得分:3)

你使用它的方式展示了UB,因为你在bool变量的边界之外写,并且你打破了严格的别名规则。

但是,如果你有一个bool并希望将它用作一个int(这通常发生在你想根据某些条件索引到一个数组中),那么标准要求-keep classmembers class com.millennialmedia** { bool转换为-keepclassmembers class com.millennialmedia.** { true bool转换为1,无论如何(UB明显被排除在外)。

例如,只要false,就可以保证输出0

52

答案 1 :(得分:3)

这一行*((int*)(&someValue)) = 50;至少是非标准的。对于int(例如4个字节),实现可以使用较小的bool(比如1或2个字节)。在这种情况下,您可以写入可能删除其他变量的变量。

无论如何,正如您在评论中所说的那样,由于严格别名规则,几乎所有通过转换指针的访问都可以被编译器视为未定义行为。唯一几乎 legal 的(对于严格的别名规则)将是:

*((char *) &someValue) = 50; 

在一个小端系统上,

*(((char *) &someValue) + sizeof(bool) - 1) = 50; 

在big endian上(仍然没有禁止字节访问)。

无论如何,由于标准没有指定bool的表示,直接在bool中写一些内容可能会导致true或false,具体取决于实现。例如,实现可以仅考虑最低级别的比特(如果val&amp; 1是1,则为真,否则为0),另一个可以考虑所有比特(对于任何非0值为真,对于仅0为假)。标准所说的唯一的事情是0的转换导致错误而非0的导致为真。

但标准强制要求是从bool转换为int:

  

4.5整体促销[conv.prom]

     

...
类型bool的prvalue可以转换为int类型的prvalue,false变为零和true   成为一个。

所以这完全解释了显示一个bool只能给0或1 - 即使前一个操作调用了UB,这里可能发生任何事情,包括这个显示

You invoked Undefined Behaviour - shame on you