c - 数据类型 : float, 在 C 中的长转换

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

我正在阅读 C primer plus,在第 3 章,数据类型中,作者说:

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

我不明白转换是如何进行的。有人可以帮我吗?谢谢。

最佳答案

256.0 是 1.0*28,对吗?

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

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

数字是正数,所以 0 进入 S

指数 8 进入 EEEEEEEE 但在到达那里之前,您需要根据格式要求向其加 127,所以 135 到那里。

现在,在 1.0 中,只有点右边的内容实际存储在 MMMMMMMMMMMMMMMMMMMMMMMM 中,所以 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 .

关于c - 数据类型 : float, 在 C 中的长转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934018/

相关文章:

c - 你可以在 double 中存储多大的数字,在 c 中用 float 存储?

c - 优化浮点计算

haskell - Haskell 中 float 的十六进制表示

指向 char 数组的 char 指针

c++ - Windows SDK 7.1 64 位构建 CloseHandle 显然不在 kernel32.lib 中

Javascript 错误地更改了简单乘法的结果。我该如何解决?

c++ - 为什么 IEEE-754 float 不能在平台之间交换?

floating-point - float 是否总是往返?

c# - 在 C# 中调用 C 函数

c++ - 是否存在我遗漏的运算符优先级问题? unsigned short 与 inverse 的比较失败