转换为联合和奇怪的数字格式

Jan*_*vák 3 c c++

任何人都可以告诉我如何使这个C代码在C++中工作吗?

uint64_t flv_dbl2int( double value )
{
    return (union {double f; uint64_t i;}){value}.i;    
}
Run Code Online (Sandbox Code Playgroud)

我不确定发生了什么,是否有点转变?

Chr*_*oph 5

据我所知,C++中打字类型的唯一法律策略是通过memcpy(),即

uint64_t flv_dbl2int(double fvalue)
{
    uint64_t ivalue;
    memcpy(&ivalue, &fvalue, sizeof ivalue);
    return ivalue;
}
Run Code Online (Sandbox Code Playgroud)

使用的直接解决方案 reinterpret_cast

uint64_t flv_dbl2int(double value)
{
    return reinterpret_cast<uint64_t&>(value);
}
Run Code Online (Sandbox Code Playgroud)

实际上是未定义的行为,与使用C风格的指针强制转换相同.

使用联合(作为原始解决方案),虽然在C中合法,但在C++中可能是非法的.在实践中,所有这些解决方案都可能有效,并且至少gcc-4.5.3和clang-3.0将在x86上生成相同的代码-O1.