(誰かがこの回答、特に境界ケースと負の値の丸めを再確認する必要があります。また、最も近い値への丸めについて書きました。C の変換を再現するには、これをゼロ方向への丸めに変更する必要があります。)
基本的に、プロセスは次のとおりです。
32 ビットを 1 つの符号ビット ( s )、8 つの指数ビット ( e )、および 23 の仮数ビット ( f ) に分割します。これらを 2 の補数の整数として扱います。
eが 255 の場合、浮動小数点オブジェクトは無限大 ( fがゼロの場合) または NaN (それ以外の場合) のいずれかです。この場合、変換は実行できず、エラーが報告されます。
それ以外の場合、eがゼロでない場合は、2 24をfに追加します。( eが 0 でない場合、仮数の前には暗黙的に 1 ビットがあります。2 24を追加すると、そのビットがfで明示的になります。)
eから 127 を引きます。(これにより、指数がバイアスされた/エンコードされた形式から実際の指数に変換されます。任意の値への一般的な変換を行う場合、eがゼロの場合の特殊なケースを処理する必要があります。127 ではなく 126 を減算します。整数の結果に変換するだけなので、これらの小さな入力数値に対して整数の結果がゼロである限り、このケースは無視できます。)
sが 0 (符号は正) でeが 31 以上の場合、値は符号付き 32 ビット整数 (2 31 以上) をオーバーフローします。変換を実行できず、エラーが報告されます。
sが 1 (符号は負) でeが 31 より大きい場合、値は符号付き 32 ビット整数 (-2 32以下) をオーバーフローします。sが 1、eが 32、fが 2 24より大きい場合(元の仮数ビットのいずれかが設定されている場合)、値は符号付き 32 ビット整数をオーバーフローします (-2 31未満です。元のfゼロだった場合、正確に -2 31になり、オーバーフローしません)。これらのいずれの場合も、変換は実行できず、エラーが報告されます。
これで、オーバーフローしない値の s、e、およびfが得られたので、最終的な値を準備できます。
sが 1の場合、 fを-fに設定します。
指数値は 1 (含む) と 2 (含まない) の間の仮数ですが、仮数は 2 24のビットから始まります。そのため、それに合わせて調整する必要があります。eが 24 の場合、仮数は正しく、完了です。したがって、結果としてfを返します。eが 24 より大きいか 24 より小さい場合は、仮数を適切にシフトする必要があります。また、 fを右にシフトする場合は、最も近い整数に丸められた結果を得るために、丸める必要がある場合があります。
eが 24 より大きい場合、fをe -24 ビット左にシフトします。結果としてfを返します。
eが -1 より小さい場合、浮動小数点数は -½ から ½ の間 (排他的) です。結果として 0 を返します。
それ以外の場合は、 fを右に 24 -eビットシフトします。ただし、最初に丸めに必要なビットを保存します。f を符号なし 32 ビット整数にキャストし、それを 32-(24- e ) ビット左にシフトした結果をrに設定します (同等に、8+ eビットだけ左にシフトします)。これは、 f (以下)からシフトアウトされるビットを取得し、32 ビットでそれらを「左に調整」するため、開始位置が固定されます。
f右に 24 -eビットシフトします。
rが 2 31未満の場合、何もしません (これは切り捨てです。シフトが切り捨てられたビットです)。rが 2 31より大きい場合、 fに 1 を追加します (これは切り上げです)。rが 2 31に等しい場合、 fの下位ビットをfに追加します。( fが奇数の場合、 f に 1 を加算します。2 つの等しく近い値のうち、これは偶数の値に丸められます。) fを返します。