floating-point - 32 位 IEEE 754 单精度浮点到十六进制
问题描述
我已经学会了如何将数字转换为浮点(在二进制、八进制和十六进制之上),并且知道如何将数字转换为浮点。
但是,在查看给我的工作表时,我遇到了以下问题:
使用 32 位 IEEE 754 单精度浮点数以十六进制显示 -12.13 的表示。
我已经尝试查看我拥有的资源,但仍然无法弄清楚如何回答上述问题。给出的答案是0xc142147b。
编辑:很抱歉没有澄清,但我想知道如何手工完成而不是编码。
解决方案
-12.13
必须先转换为二进制,然后再转换为十六进制。让我们或多或少地像glibc库那样做,只使用笔和纸和 Windows 计算器。
删除标志,但请记住我们有一个:12.13
有效数字(或尾数)
整数部分,12
很简单:(C
十六进制)
小数部分,0.13
有点棘手。0.13
是13/100
。我使用 Windows 计算器(程序员模式,十六进制)并将13
(十六进制D
)向左移动 32(*)位:D00000000
. 将其除以100
(hex 64
) 得到:2147AE14
hex。
由于我们需要一个低于 1 的值,我们再次右移 32 位,得到:0.2147AE14
现在在左边添加整数部分:C.2147AE14
我们只需要 24 位的尾数,所以我们四舍五入:C.2147B
-->C2147B
现在必须对其进行归一化,因此二进制点向左移动 3 位(当然,这些位保持不变)。指数(最初为 0)相应地增加了 3,所以现在它是 3。
现在可以删除隐藏位:(42147B
现在是 23 个低位)
现在可以将其转换为 32 位值:0x0042147B
指数和符号
现在让我们采用指数: + hex = hex或二进制3
的偏差。7F
82
1000 0010
在左侧添加符号位:1 1000 0010
. 重新组合:1100 0001 0
或C10
当然这些是最高位,所以我们把它变成0xC1000000
完整的 32 位
“按位或”两个部分
0xC100000 | 0x0042147B = 0xC142147B
这就是你想要的价值。
(*) 32 位,所以我有足够多的位可以在以后正确舍入。
推荐阅读
- c++ - C++ 运算符重载中的类型推断
- node.js - 为什么我的 deleteMessage 功能不起作用?
- angular - PrimeNG:资产文件夹中的 MenuItem 图标未显示
- c++ - 如何以与 C++ 中的父字符串相同的顺序获取字符串的字符集
- gnu-make - 如何检测是否需要共享库符号链接?
- android - 创建 Uri 到文件,有点无法提交数据
- php - 如何通过条件使用“with”laravel 关系函数来获取数据?
- matplotlib - Matplotlib 的后端不会从 TkAgg 更改为 GR
- javascript - 多个并发 setInterval() 会影响性能吗?
- asp.net-core - TagHelper 任务在升级到 Visual Studio 16.8.2 后意外失败