私はCの入門書と、第3章のデータ型を読んでいました。著者は次のように述べています。
浮動小数点数 256.0 を表すビット パターンを取り、それを long 値として解釈すると、113246208 が得られます。
変換の仕組みがわかりません。誰かがこれで私を助けることができますか? ありがとう。
私はCの入門書と、第3章のデータ型を読んでいました。著者は次のように述べています。
浮動小数点数 256.0 を表すビット パターンを取り、それを long 値として解釈すると、113246208 が得られます。
変換の仕組みがわかりません。誰かがこれで私を助けることができますか? ありがとう。
その引用から重要なことは、integer/long と float が異なる形式でメモリに保存されるため、float を含むメモリのビットを単純にピックアップして、int であると言って正しい値を取得することはできないということです。 .
各データ型がメモリに保存される方法の詳細は、IEEE 標準を検索して見つけることができますが、それはおそらく引用の目的ではありません。伝えようとしているのは、浮動小数点数と整数は異なるパターンを使用して保存され、単純に浮動小数点数を int として使用したり、その逆を行ったりすることはできないということです。
256.0 は 1.0*2 8ですね。
次に、フォーマットを見てください (@bash.d から盗みます):
31 0
| |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSA
数は正なので、0
に入りS
ます。
指数 、8
が入りEEEEEEEE
ますが、そこに入る前にadd 127
、フォーマットで必要とされるように、そこ135
に入る必要があります。
現在、1.0
ポイントの右側にあるものだけが実際に に格納されるMMMMMMMMMMMMMMMMMMMMMMM
ため、そこに 0 が入ります。は1.
、形式で表されるほとんどの数値で暗示され、実際には形式に格納されません。
ここでの考え方は、ゼロ以外のすべての数値の絶対値を次のように変換できるということです。
1.0...1.111(1) * 10一部の整数(すべての数値は 2 進数)
またはほぼ同等
1.0...1.999(9) * 2何らかの整数(すべての数値は 10 進数)
それが私の答えの一番上で私がしたことです。変換は、仮数が 10 進数の範囲 [1.0, 2.0) (または [1.0, 10.0) (バイナリでは [1.0, 10.0)]) になるまで、数値を 2 で除算または乗算することによって行われます。ゼロ以外の数値には常にこの 1 があるのに、なぜそれを保存するのでしょうか? そのため、保存されず、別の空きM
ビットが提供されます。
したがって、次のようになります。
(0 << 31) + ((8 + 127) << 23) + 0 = 1132462080
フォーマットはここで説明されています。
整数値と long 値は通常 2 の補数を使用して表さfloat
れますが、ビットのみを使用して float 値を表示するようにコンピューターに指示することはできないため、-values には特別なエンコーディングがあります。32 ビットの浮動小数点数には、符号ビット、仮数、および指数が含まれます。これらは一緒にfloat
が持つ価値を決定します。記事はこちら
を
ご覧ください。
編集
したがって、これは IEEE 754 によってエンコードされた float がどのように見えるか (32 ビット)
31 0
| |
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSE
のパターンはわかりません256.0
が、長い値は純粋に次のように解釈されます
31 0
| |
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB // B - BIT
したがって、「変換」はありませんが、異なる解釈があります。