double が署名されています。これは、最初のビット (最上位ビット、別名符号ビット) が、この数値が正か負かを決定することを意味します。
unsigned int は、最初のビット (最上位ビット) を使用して表現できる「正の」数値の範囲を拡張するため、負の値を処理できません。そうで
double d1 = -2 * a * b;
実行すると、マシンは (-2 * a * b) 全体を unsigned int 構造体 (a や b など) に配置し、次のバイナリ 1111 1111 1111 1111 1111 1111 1001 0000 を生成します (これは 112 の 2 の補数であるため) 0000 0000 0000 0000 0000 0000 0111 0000 です)。しかし、ここでの問題は、それが unsigned int であるため、最初の 1 を符号ビットとして扱わないため、非常に大きな正の整数 (4294967184) として扱われることです。
次に、それを double に入れるので、.00000 が印刷されます。
もう 1 つの例は、a を double に、b を double に型キャストするため機能します。そのため、-2 を double で乗算すると、コンピューターはそれを double 構造に配置するため、符号ビットが考慮されます。
double d3 = -2 * (double) (a * b)
同様に動作します。
署名付きと署名なしの感覚を得るには、これを確認してください