-2

我在上面的语句中引用了文件。预期产出是双倍的。我找不到与我的问题相关的任何内容。 我发现这个 Passing a structure through Sockets in C 但不知道它是否相关。 我不读那个int64值。我从其他过程中获得它,这就是它的设计方式。每个反序列化的64位整数应该转换为位等价的64位浮点数

有没有人有关于整数的串行化和反序列化的理论?

+2

你为什么不读出的数据直接导入'double'? – NathanOliver

+0

std :: memcpy会为你做。 int64和float的联合是UB, –

+0

感谢Nathan的更新。我没有阅读那篇文章。我从其他过程中获得它,这就是它的设计方式。 –

回答

-3

如何读取64位数字并使用reinterpret_cast将其转换为按位等效的浮点数。

int64_t a = 121314; 
double b = *reinterpret_cast<double*>(&a); 
int64_t c = *reinterpret_cast<int64_t*>(&b); 
assert(a==c); 
+1

谢谢,但它不会生成错误C2440:'reinterpret_cast':无法从'int64_t'转换为'双' –

+0

击败我:) –

1

恰好有一个按位拷贝的一种类型到另一个在C++定义的方式 - memcpy

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; 
} 

输出示例:

1.1 3ff199999999999a 1.1 
+0

void * comp =&(x_double);双分量=(*(F64 *)comp);我得到了不是核心的答案。但感谢您的帮助 –

+0

您可能会得到相同的答案,但使用c样式转换时的行为不是由标准定义的 –

相关问题