为什么float.MaxValue是0xFF 0xFF 0x7F 0x7F而不是像int一样是0x7F, 0xFF, 0xFF, 0xFF?

5

我猜这需要更多的信息。但是,为什么会这样呢?

(这里假设23位浮点类型基于IEEE 754的32位二进制浮点数,并且采用小端格式。)

在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


1
关于字节序 - 最好将所有单独的4个1字节十六进制序列写成4个字节的十六进制值,因为0x7F、0xFF、0xFF、0xFF作为4个连续的存储器字节被理解为0xFFFFFF7F(小端)和0x7FFFFFFF(大端),因此如果这里是4字节的十六进制值(从左至右读取),则字节序编辑对此帖子是不正确的,因为这是大端。 - Artur
@Artur 我正在将字节数组转换为浮点数,所以这大概就是它的来源。我会编辑一下以提高可读性。 - AStackOverflowUser
6个回答

9
你说:
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)•2254-127 = 1•(1+1)•2127,大约是2•2127 = 2128 ≈ 3.40282347E+38。
您可能会想知道为什么指数是254而不是255。指数值255是一个特殊情况,如果尾数(分数)字段为零,则将指数设置为255的值视为正无穷或负无穷(取决于符号位),如果尾数字段不为零,则将其视为NaN。

2

假设32位浮点类型基于IEEE 754 32位二进制浮点数。

最大的有限浮点数在符号位和最不重要的指数位都为零。在大端十六进制中,它是0x7f7fffff。符号位是数字的最高有效位,为零表示正数。次低有效字节的最高位为零,以获得有限数字。所有指数位都为1是NaN或无穷大。

0xffff7f7f是小端表示法。


没错,我应该把这个问题添加上去,非常感谢Patricia。 - AStackOverflowUser

2
看起来您的字节序有些混乱。最大的单精度(32位)IEEE-754浮点数由以下组成:
  • 一个符号位,正数为零
  • 八位指数,不能全部是1(因为那将意味着该值为NaN),所以最大值为11111110 = 254(偏置)= 127(实际指数)
  • 23位尾数,其中最大值为所有位都是1
因此,我希望最大的单精度浮点值看起来像0x7F7FFFFF。

2

浮点数数据格式与整数格式非常不同。该值由三个组成部分组成,即符号、指数和有效数字。这些单独的组件分布在数据格式的多个字节上。例如,符号是一个单独的位,存储在与另一个组件相同的字节中。

总之,您对整数表示法所知道的内容不适用于浮点表示法。


1
浮点数和浮点数总体上与整数有些不同。 整数只是整数值的二进制补码表示,而浮点数由不同的部分组成:符号位(S),指数字段(E)和从左到右的有效数字或尾数(M)。
最大可用指数为0xFE,因为0xFF是表示无穷大的特殊值。
所以我们有一个符号位,对于正数为0,最大指数为0xFE,尾数全为1,结果为 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM 01111111 01111111 11111111 111111117F 7F FF FF 由于在小端机器中,字节顺序是反转的,所以所看到的是 FF FF 7F 7F

1

对于 IEEE 754-1985 规范,浮点数的格式为 S8.24。
因此,最大规格化数是 2^127*(2-2^-23)。
当以二进制编码时,结果为 0,1111 1110,111 1111 1111 1111 1111 1111
请在 IEEE 754-1985 中查找更详细的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接