-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樣式轉換時的行爲不是由標準定義的 –