你说:
int.MaxValue = 0x7F,0xFF,0xFF,0xFF = 01111111 11111111 11111111 11111111 = 2147483647
int.MaxValue确实是2147483647,因为这是一个32位的值,在
二进制补码中表示,并且在您的情况下以这种方式评估:
value = -2^31b31 + b30•2^30 + b29•2^29 + … + b0•2^0 = 2147483647(因为所有位b0到b30都是1,而b31是0)。
你说:
In floats:
0x7F, 0xFF, 0xFF, 0xFF = 01111111 11111111 11111111 11111111 = 2.14748365E+9
那有点不正确。你所做的是将int.MaxValue转换为float(你没有解释最大int值的编码方式为float - 你改变了表示方式),即:
2.14748365E+9 ≈ 2147483647 = 2147483647.0 — 对于人类来说都是相同的东西,但浮点数和整数在内存中的编码方式不同。
但是
2147483647.0的十六进制表示(四舍五入为float)为0x4f000000而不是0x7F,0xFF,0xFF,0xFF。
原因在于(
单精度浮点数格式):
0x4f000000的值为(-1)^0•(1+0)•2^158-127 = 1•1•2^31 = 2^31 = 2147483648.0。
您可以在此处
在线IEE754转换器中自行检查。
你还说:
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是一个特殊情况,如果尾数(分数)字段为零,则将指数设置为255的值视为正无穷或负无穷(取决于符号位),如果尾数字段不为零,则将其视为NaN。