あまり移植性がなく、標準に違反していますが、次のようなものです。
std::array<unsigned char, 8> serialize_double( double const* d )
{
std::array<unsigned char, 8> retval;
char const* begin = reinterpret_cast<char const*>(d);
char const* end = begin + sizeof(double);
union
{
uint8 i8s[8];
uint16 i16s[4];
uint32 i32s[2];
uint64 i64s;
} u;
u.i64s = 0x0001020304050607ull; // one byte order
// u.i64s = 0x0706050403020100ull; // the other byte order
for (size_t index = 0; index < 8; ++index)
{
retval[ u.i8s[index] ] = begin[index];
}
return retval;
}
は、8 ビットの文字、8 バイトの倍精度浮動小数点数、およびクレイジーなお尻のバイト順 (つまり、単語ではビッグ エンディアンで、64 ビット値では単語間のリトル エンディアンなど) のプラットフォームを処理する場合があります。
現在、これは double のエンディアンが 64 ビット int のエンディアンと異なることをカバーしていません。
もっと簡単な方法は、double を 64 ビットの unsigned 値にキャストし、それを他の int と同じように出力することです。