-2

私は上記の文を私が参照しています。期待される出力は倍です。私は私の問題に関連する何かを見つけることができませんでした。 私はこれを見つけました Passing a structure through Sockets in C しかし、その関連性が分かっていません。 私はそのint64値を読んでいません。私は他のプロセスからそれを取得しており、それが設計されている方法です。逆シリアル化された各64ビット整数は、ビットごとに等価の64ビット浮動小数点数に変換する必要があります

intのシリアル化とデシリアライズに関する理論はありますか?

+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'から 'double'に変換できません –

+0

私にそれを打つ:) –

1

C++で別のものに、ビット単位のコピー1種類をするために正確に一つの定義された方法があります - 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スタイルのキャストを使うときの振る舞いは標準によって定義されていません –

関連する問題