我已经学会了如何将数字转换为浮点数(在二进制,八进制和十六进制之上),并且知道如何将数字转换为浮点数。
但是,在查看我给出的工作表时,我遇到了以下问题:
使用32位IEEE 754单精度浮点显示十六进制中-12.13的表示。
我已经尝试查看我拥有的资源,但仍然无法弄清楚如何回答上述问题。答案是0xc142147b。
编辑:很抱歉没有澄清,但我想知道如何手动完成而不是编码。
必须将-12.13
转换为二进制,然后转换为十六进制。让我们或多或少像glibc库一样,只使用笔和纸以及Windows计算器。
删除标志,但请记住我们有一个:12.13
整数部分,12
很容易:C
(hex)
分数部分,0.13
有点棘手。 0.13
是13/100
。我使用Windows计算器(程序员模式,十六进制)并将13
(hex 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
现在让我们看看指数:3
+ hex 7F
= hex 82
,或1000 0010
二进制的偏差。
添加左侧的符号位:qazxsw poi。重组:qazxsw poi或qazxsw poi
当然这些都是顶部位,所以我们将其转换为1 1000 0010
为完整的32位
1100 0001 0
这就是你想要的价值。
(*)32位所以我有足够的位可以正常舍入,稍后。
要编写浮点数,我们必须将其重写为(-1)s 2e 1.m并以32位编码不同的部分,如下所示
C10
(来自0xC1000000
)
困难的部分是将尾数转换为二进制。对于某些数字,这很容易。例如,5.75 = 4 + 1 + 1/2 + 1/4 = 22 + 20 + 2-1 + 2-2 = 101.11 = 1.0111×22
对于其他数字(与你的一样),它更难。解决方法是将数字乘以2,直到找到整数或超过代码中的总位数(23 + 1)。
我们可以为您的号码做到这一点:
0xC100000 | 0x0042147B = 0xC142147B
下一次迭代将导致大于2 ^ 24(= ~16M)的数字,我们可以停止。
尾数代码很容易(但有点长)使用常规方法手动转换为二进制,其代码为0xc2147b。如果我们将位置223中的前导位提取为1并将其保留为“点”,则我们有尾数= 1.42147b×223(其中小数部分限制为23位)。由于我们不得不将初始数乘以220得到这个值,我们终于有了
MANT = 1.42147b×23
因此指数为3,其代码为3 + 127 = 130
EXP = 130D =为0x82
而且数字是负数
签= 1
我们只需要抑制尾数的整数部分(隐藏位)并连接这些数字以获得最终值0xc142147b
(当然,我用一个程序来生成这些数字。如果有兴趣,这里是C代码)