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

时间:2013-11-11 07:37:10

标签: 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

6 个答案:

答案 0 :(得分:9)

你说:

  

int.MaxValue = 0x7F,0xFF,0xFF,0xFF = 01111111 11111111 11111111 11111111 = 2147483647

int.MaxValue确实是2147483647,因为这是一个32位值,在two’s complement中签名和编码,在你的情况下以这种方式估价:

  

值= -2 31 b 31 + b 30 •2 30 + b < sub> 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。

这就是为什么(single precision floating point format):

enter image description here

  

0x4f000000的值为(-1) 0 •(1 + 0)•2 158-127 = 1•1•2 31 = 2 31 = 2147483648.0

您可以在online IEE754 converter查看自己。

你也说过:

  

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的值被视为+无穷大或无穷大(取决于符号位) )如果有效数字段不为零,则字段为零,并且为NaN。

答案 1 :(得分:2)

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

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

0xffff7f7f是little-endian表示。

答案 2 :(得分:2)

看起来您的字节序混淆了。最大单精度(32位)IEEE-754浮点值由以下内容组成:

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

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

答案 3 :(得分:2)

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

底线是您对整数表示的了解不适用于浮点表示。

答案 4 :(得分:1)

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

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

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

SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

01111111 01111111 11111111 111111117F 7F FF FF

因为在一个小端机器中,字节的顺序是相反的,你看到的是

FF FF 7F 7F

答案 5 :(得分:1)

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