他の人がすでに言ったように、予期しないときにint
to を渡すと、未定義の動作が発生し、何かが起こる可能性があります。プログラムが乱数ではなく 3 行目に出力する理由に興味があるかもしれません。printf
double
98.979980
引数はスタックで渡されprintf
ます。行 2 が渡さ98.98
れると、番号の最下位部分が最初printf
にスタックにプッシュされます。
そのprintf
後戻り、3 行目で再度呼び出さ98
れ、スタックにプッシュされます。あなたのアーキテクチャでは、int
タイプは 32 ビットのようです。型のサイズの半分であるため、以前にスタックにあっdouble
た下半分のみが上書きされます。98.98
98.98 の上半分はまだスタックにあります。
への 3 番目の呼び出しは、スタックからprintf
a を読み取ります。double
読み取るものの最上位半分は、98.98
以前にスタックにあった から取得され、下位半分は のバイナリ表現から取得され98
ます。これが、結果が に非常に近い理由98.98
です。98 は非常に小さい数値であるため、最上位ビットは 0 になり、最下位半分98.98
をほとんどゼロに設定すると、より小さな数値が得られます。
行 3 で、より多くのビットが 1 に設定された数値を使用した場合、より大きな結果が得られます98.98
。たとえば、-1 のバイナリ表現では、すべてのビットが 1 に設定されており、次のようになります。
printf("line 2: %f\n", 98.98); # 98.98
printf("line 3: %f\n", -1); # 98.980042
コンパイラが 64 ビットの int を使用した場合、またはdouble
最上位部分を最初に s に渡した場合、またはスタックの代わりにレジスタを使用してパラメーターを渡した場合、非常に異なる結果が得られます。