【问题标题】:data type: float, long conversion in C数据类型:C 中的浮点、长转换
【发布时间】:2013-04-02 18:38:20
【问题描述】:

我在看Cprimer plus,在第3章,数据类型,作者说:

如果您采用表示浮点数 256.0 的位模式并将其解释为长值,您将得到 113246208。

我不明白转换是如何工作的。有人可以帮助我吗?谢谢。

【问题讨论】:

  • 还要注意作者假设longfloat 具有相同的大小。现在不是一个安全的假设。

标签: c floating-point ieee-754 type-conversion


【解决方案1】:

该引用的重要之处在于整数/长整数和浮点数以不同的格式保存在内存中,因此您不能简单地拿起一些有浮点数的内存并说现在它是一个 int 并得到一个正确的值。

可以在搜索 IEEE 标准中找到有关如何将每种数据类型保存到内存中的详细信息,但这也可能不是引用的目标。它试图告诉您的是,浮点数和整数是使用不同的模式保存的,您不能简单地将浮点数用作 int,反之亦然。

【讨论】:

    【解决方案2】:

    虽然整数和长整数值通常使用二进制补码表示,但float-values 具有特殊的编码,因为您无法告诉计算机仅使用位来显示浮点值。 一个 32 位浮点数包含一个符号位、一个尾数和一个指数。这些共同决定了float 的价值。
    文章见here

    编辑

    这就是 IEEE 754 编码的浮点数的样子(32 位)

    31                             0
    |                              |
    SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSE
    

    我不知道 256.0 的模式,但 long 值将被纯粹解释为

    31                             0
    |                              |
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB // B - BIT
    

    所以没有“转换”,而是不同的解释。

    【讨论】:

    • @user2157668 添加了一些内容
    【解决方案3】:

    256.0 是 1.0*28 对吧?

    现在,看看格式(从@bash.d 中窃取):

    31                             0
    |                              |
    SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM //S - SIGN , E - EXPONENT, M - MANTISSA
    

    这个数字是正数,所以0 变成S

    指数8 进入EEEEEEEE,但在它进入之前,您需要根据格式的要求对其进行add 127,所以135 进入那里。

    现在,1.0 中只有点右边的内容实际上存储在 MMMMMMMMMMMMMMMMMMMMMMM 中,所以 0 就在那里。 1. 隐含在该格式中表示的大多数数字中,实际上并未以该格式存储。

    这里的想法是所有非零数的绝对值都可以转化为

        1.0...1.111(1) * 10一些整数(所有数字都是二进制)

    或几乎相等

        1.0...1.999(9) * 2一些整数(所有数字都是小数)

    这就是我在回答顶部所做的。转换是通过将数字重复除或乘以 2 来完成的,直到您得到十进制范围 [1.0, 2.0)(或二进制 [1.0, 10.0) 中的尾数)。既然这个 1 总是在一个非零的数字中,为什么要存储它呢?因此它不会被存储,并为您提供另一个免费的M 位。

    所以你最终得到:

    (0 << 31) + ((8 + 127) << 23) + 0 = 1132462080
    

    格式描述here

    【讨论】:

    • 感谢您的详细解释,这超出了我的知识范围,我需要一些时间来阅读和理解它。
    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多