(通常) double には 64 ビットが含まれ、各 int には 32 ビットがあるため、ビットを double に直接格納するだけでよいと考えるでしょう。たとえば、次のようになります。
int32_t i1 = rand();
int32_t i2 = rand();
int64_t x = (((int64_t)i1)<<32) | ((int64_t)i2);
double theDouble;
memcpy(&theDouble, &x, sizeof(theDouble));
...そしてそれを「ほぼうまくいく」。つまり、i1 と i2 の多くの可能な値に対して問題なく動作しますが、すべての値に対してではありません。特に、IEEE754 浮動小数点形式の場合、指数ビットが 0x7ff に設定されている値はすべて「NaN」を示すものとして扱われ、浮動小数点ハードウェアは異なる NaN に相当するビットパターンを変換して、優先するパターンに戻すことができます (実際に変換します)。 double を引数として渡すときの NaN ビットパターンなど。
このため、2 つの 32 ビット整数を double に詰め込むと、ほとんどの場合はうまくいくように見えますが、考えられるすべての入力値でテストすると、値が double 内に留まっている間に予期せず変化する場合がいくつか見つかります。それらを再度デコードすると、異なる値として出てきました。
もちろん、double の仮数ビットのみを設定するように注意することでこれを回避できますが、それでは整数あたり 26 ビットしか得られないため、+/- 33,554,432 程度の整数値しか格納できません。ユースケースによっては、それで問題ないかもしれません。
私のアドバイスは、あなたがやろうとしていることは何でもするための別の方法を見つけることです. 非浮動小数点データを浮動小数点変数に格納すると、特にコードを移植可能にしたい場合に問題が発生します。