5

これには追加情報はほとんど必要ないと思います。でも、どうしてこうなの?

(これは、23 ビット float 型が IEEE 754 32 ビット 2 進浮動小数点とリトル エンディアンに基づいていることを前提としています。)

32 ビット int では、次の理由から非常に簡単です。

int.MaxValue = 0x7FFFFFFF = 01111111 11111111 11111111 11111111 = 2147483647

フロートの場合:

0x7FFFFFFF = 01111111 11111111 11111111 11111111 = 2.14748365E+9

E+9 表記を取得します。しかし、その理由は次のとおりです。

float.MaxValue = 0xFFFF7F7F = 11111111 11111111 01111111 01111111 = 3.40282347E+38

4

6 に答える 6

9

あなたが言った:

int.MaxValue = 0x7F、0xFF、0xFF、0xFF = 01111111 11111111 11111111 11111111 = 2147483647

int.MaxValue は実際には 2147483647 です。これは、2 の補数で署名およびエンコードされた 32 ビット値であり、この場合は次のように評価されるためです。

値 = -2 31 b 31 + b 30 •2 30 + b 29 •2 29 + … + b 0 •2 0 = 2147483647 (すべてのビット b 0~ b 30が 1 で、b 31が 0 であるため)。

あなたが言った:

float の場合: 0x7F、0xFF、0xFF、0xFF = 01111111 11111111 11111111 11111111 = 2.14748365E+9

それは少し間違っています。あなたがしたことは、 int.MaxValue を float に変換することです (最大 int 値のエンコーディングを float として解釈していません - 表現を変更しました)。

2.14748365E+9 ≈ 2147483647 = 2147483647.0 — 人間にとってはすべて同じものですが、浮動小数点値と整数はメモリ内で異なる方法でエンコードされます

しかし

2147483647.0 の 16 進表現 (浮動小数点数に丸めた場合) は、0x7F、0xFF、0xFF、0xFF ではなく 0x4f000000 です。

理由は次のとおりです(単精度浮動小数点形式):

ここに画像の説明を入力

0x4f000000 の値は (-1) 0 •(1+0)•2 158-127 = 1•1•2 31 = 2 31 = 2147483648.0

ここでオンライン IEE754 コンバーターを確認してください。

あなたはまた言った:

float.MaxValue = 0xFF 0xFF 0x7F 0x7F = 11111111 11111111 01111111 01111111 = 3.40282347E+38

3.40282347E+38の値は正しいですが、その 16 進表現は 0xFF 0xFF 0x7F 0x7F ではなく 0x7f7fffff です。

この方法で 0x7f7fffff をデコードできます。

(-1) 0 •(1+2 -1 +2 -2 +2 -3 +…+2 -23 )•2 254-127 = 1•(1+1)•2 127、これは約 2•2 127 = 2 128 ≒ 3.40282347E+38。

なぜ指数が 255 ではなく 254 なのか不思議に思うかもしれません。指数値 255 は特殊なケースであり、指数が 255 に設定された値は、仮数 (小数) フィールドが仮数フィールドがゼロでない場合は NaN として。

于 2013-11-11T08:30:51.077 に答える
2

これは、32 ビット浮動小数点型が IEEE 754 32 ビット 2 進浮動小数点に基づいていることを前提としています。

最大の有限浮動小数点数は、符号ビットと最下位指数ビットの両方にゼロがあります。0x7f7fffff であるビッグエンディアン 16 進数。数値の最上位ビットである符号ビットは、数値を正にするためにゼロです。2 番目のバイトの最上位ビットである最下位指数ビットは、有限数を取得するためにゼロです。すべての指数ビット 1 は NaN または無限大です。

0xffff7f7f はリトルエンディアン表現です。

于 2013-11-11T08:22:36.293 に答える
2

エンディアンが混乱しているようです。最大の単精度 (32 ビット) IEEE-754 float 値は、次のもので構成されます。

  • 1 つの符号ビット (正の数の場合はゼロ)
  • 指数の 8 ビット。すべて 1 にすることはできません (値が NaN であることを意味するため)。したがって、最大値は 11111110 = 254 (バイアス) = 127 (実際の指数) です。
  • 23 ビットの仮数。最大値はすべて 1 です。

したがって、単精度浮動小数点の最大値は 0x7F7FFFFF のようになると思います。

于 2013-11-11T08:26:07.777 に答える
2

浮動小数点データ形式は、整数形式とはかなり異なります。値は、符号、指数、仮数の 3 つのコンポーネントで構成されます。これらの個々のコンポーネントは、データ形式内の複数のバイトにまたがっています。たとえば、符号は 1 ビットで、別のコンポーネントと同じバイトに格納されます。

肝心なのは、整数表現について知っていることは、浮動小数点表現には当てはまらないということです。

于 2013-11-11T08:26:08.637 に答える