あなたが言った:
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 として。