为什么float.MaxValue 0xFF 0xFF 0x7F 0x7F而不是0x7F,0xFF,0xFF,0xFF就像整数?

ASt*_*ser 5 c# floating-point integer ieee-754

我想这需要额外的信息.但是,为什么会那样?

(这假设23位浮点类型基于IEEE 754 32位二进制浮点和Little Endianness.)

在32位整数中,它非常简单,因为:

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

Art*_*tur 9

你说:

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(你没有将max 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是一种特殊情况,指数设置为255的值被视为+无穷大或-infinity(取决于符号位),如果有效数(分数)字段是如果有效数字段不为零,则为零和NaN.