5

我想这几乎不需要额外的信息。但是,为什么会这样呢?

(假设 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

4

6 回答 6

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 (您尚未将最大 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。

于 2013-11-11T08:30:51.077 回答
2

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

最大的有限浮点数在符号位和最低有效指数位中都为零。在大端十六进制中,即 0x7f7fffff。符号位,数字的最高有效位,为零以使其为正。最低有效指数位,即第二个字节的最高有效位,为零以获得有限数。所有指数位 1 都是 NaN 或无穷大。

0xffff7f7f 是小端表示。

于 2013-11-11T08:22:36.293 回答
2

看起来你的字节顺序很混乱。最大单精度(32 位)IEEE-754浮点值由以下部分组成:

  • 一个符号位,对于正数为零
  • 八位指数,不能全为 1(因为这意味着该值为 NaN),因此最大值为 11111110 = 254(有偏)= 127(实际指数)
  • 23位尾数,最大值为全1

所以我希望最大单精度浮点值看起来像 0x7F7FFFFF。

于 2013-11-11T08:26:07.777 回答
2

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

最重要的是,您对整数表示的了解不适用于浮点表示。

于 2013-11-11T08:26:08.637 回答
1

浮点数和浮点数通常与整数略有不同。虽然 ints 只是整数值的二进制补码表示,但浮点数由不同的部分组成:符号位 (S)、指数字段 (E) 和有效数或尾数 (M),从左到右

最大可用指数是 0xFE,因为 0xFF 是一个表示无穷大的特殊值。

所以我们有一个符号位,正数为 0,最大指数为 0xFE,尾数全为 1,导致

SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

01111111 01111111 11111111 11111111或者7F 7F FF FF

而且由于在小端机器中,字节的顺序是颠倒的,你看到的是

FF FF 7F 7F

于 2013-11-11T08:33:10.267 回答
1

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

于 2013-11-11T08:34:20.857 回答