投向布尔时得不到1

时间:2019-07-11 14:38:19

标签: c++ gcc casting boolean gcc9

我有以下代码:

#include <iostream>

void f(void* buffer) {
    int x = static_cast<bool>(*(char*)buffer);
    int y = static_cast<bool>(*(bool*)buffer);
    std::cout << x << " " << y;
}

int main() {
    int a = 255;
    f(&a);
}

在GCC 9.1上,我得到以下输出:

  

1 255

为什么将具有bool强制转换结果(char*)的{​​{1}}强制转换为1,而将具有x强制转换结果bool的强制转换为(bool*)在这种情况下为255?

2 个答案:

答案 0 :(得分:5)

  

为什么用(bool *)强制转换为bool ...?

因为程序的行为是不确定的。

标准说(引用最新草案):

  

[basic.lval]

     

如果程序尝试通过glvalue访问对象的存储值,该glvalue的类型与以下类型之一不相似([conv.qual])行为未定义:      

      
  • 对象的动态类型,
  •   
  • 一种类型,它是与对象的动态类型相对应的有符号或无符号类型,或者
  •   
  • char,unsigned char或std :: byte类型。
  •   

boolbuffer的动态类型不相似,它既不是unsigned也不是unsigned的对应类型,也不是char {{1} }或unsigned char。因此行为是不确定的。

  

为什么将(char *)强制转换为布尔值将x设为1

因为std::byte的第一个字节包含一个不代表零的值。是否会这样取决于CPU体系结构。整数的字节顺序由实现定义。

请注意,在这种情况下,行为将得到很好的定义,因为在引用的规则中,a被列为例外之一。

答案 1 :(得分:1)

您需要使用exestr。例如

reinterpret_cast<int *>

这是一个演示程序

int y = static_cast<bool>(*reinterpret_cast<int*>( buffer ));