你说:
int.MaxValue = 0x7F、0xFF、0xFF、0xFF = 01111111 11111111 11111111 11111111 = 2147483647
int.MaxValue 确实是 2147483647 因为这是一个 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)。
你说:
在浮点数中:0x7F、0xFF、0xFF、0xFF = 01111111 11111111 11111111 11111111 = 2.14748365E+9
这有点不正确。您所做的是将 int.MaxValue 转换为 float (您尚未将最大 int 值的编码解释为 float - 您已更改表示形式),即:
2.14748365E+9 ≈ 2147483647 = 2147483647.0 — 对于人类来说都是一样的东西,但是浮点值和整数在内存中的编码方式不同
但
2147483647.0 的十六进制表示(当舍入为浮点数时)是 0x4f000000 而不是 0x7F、0xFF、0xFF、0xFF。
这就是原因(单精度浮点格式):
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的值是正确的,但是它的十六进制表示不是 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。
您可能想知道为什么指数是 254 而不是 255。指数值 255 是一种特殊情况,如果有效数(分数)字段为零,如果有效数字字段不为零,则为 NaN。