C++ 每个反序列化的64位整数应转换为位等效的64位浮点数

C++ 每个反序列化的64位整数应转换为位等效的64位浮点数,c++,serialization,floating-point,deserialization,bitwise-operators,C++,Serialization,Floating Point,Deserialization,Bitwise Operators,我参考的文件中有上述声明。预期产量是原来的两倍。我找不到任何与我的问题有关的东西。 我找到了这个 但我不知道这是否相关。 我没有读取那个int64值。我是从其他过程中得到的,这就是它的设计方式 有人对int的序列化和反序列化有什么理论吗?读取该64位数字并使用reinterpret\u cast将其转换为按位等效的浮点数怎么样 int64_t a = 121314; double b = *reinterpret_cast<double*>(&a); int64_t c =

我参考的文件中有上述声明。预期产量是原来的两倍。我找不到任何与我的问题有关的东西。 我找到了这个 但我不知道这是否相关。 我没有读取那个int64值。我是从其他过程中得到的,这就是它的设计方式


有人对int的序列化和反序列化有什么理论吗?

读取该64位数字并使用reinterpret\u cast将其转换为按位等效的浮点数怎么样

int64_t a = 121314;
double b = *reinterpret_cast<double*>(&a);
int64_t c = *reinterpret_cast<int64_t*>(&b);
assert(a==c);
int64_t a=121314;
双b=*重新解释铸型(&a);
int64_t c=*重新解释铸件(&b);
断言(a==c);

> p>在C++中,有一种定义的方式将一种类型复制到另一种类型:
template<class Out, class In, std::enable_if_t<(sizeof(In) == sizeof(Out))>* = nullptr>
Out mangle(const In& in)
{
    Out result;
    std::memcpy(std::addressof(result), std::addressof(in), sizeof(Out));
    return result;
}


int main()
{
    double a = 1.1;
    auto b = mangle<std::uint64_t>(a);
    auto c = mangle<double>(b);

    std::cout << a << " " << std::hex << b << " " << c << std::endl;
}

为什么不直接将数据读入一个
double
。int64和float的联合是UB,谢谢Nathan的更新。我没有读那个。我从另一个过程中得到它,这就是它的设计方式。@richardcrittenvoid*comp=&(x_double);双成分=(*(F64*)成分;我想这也是一样的,它不起作用了。memcpy现在是在不同类型之间复制数据的唯一标准定义方式(iirc很少有带有字符/无符号字符的边缘情况)。感谢您,但它不会生成错误C2440:“reinterpret_cast”:无法从“int64_t”转换为“double”void*comp=&(x_double);双成分=(*(F64*)成分;我得到了同样的答案,但不是正确的。但是,感谢您的帮助,您可能会得到相同的答案,但是使用c样式转换时的行为没有被标准定义
1.1 3ff199999999999a 1.1