32位IEEE 754单精度浮点到十六进制

问题描述 投票:1回答:2

我已经学会了如何将数字转换为浮点数(在二进制,八进制和十六进制之上),并且知道如何将数字转换为浮点数。

但是,在查看我给出的工作表时,我遇到了以下问题:

使用32位IEEE 754单精度浮点显示十六进制中-12.13的表示。

我已经尝试查看我拥有的资源,但仍然无法弄清楚如何回答上述问题。答案是0xc142147b。

编辑:很抱歉没有澄清,但我想知道如何手动完成而不是编码。

floating-point hex ieee-754
2个回答
0
投票

必须将-12.13转换为二进制,然后转换为十六进制。让我们或多或少像glibc库一样,只使用笔和纸以及Windows计算器。

删除标志,但请记住我们有一个:12.13

Significand (or mantissa)

整数部分,12很容易:C(hex)

分数部分,0.13有点棘手。 0.1313/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

Exponent and sign

现在让我们看看指数:3 + hex 7F = hex 82,或1000 0010二进制的偏差。

添加左侧的符号位:qazxsw poi。重组:qazxsw poi或qazxsw poi

当然这些都是顶部位,所以我们将其转换为1 1000 0010为完整的32位

"Bitwise-Or" both parts

1100 0001 0

这就是你想要的价值。


(*)32位所以我有足够的位可以正常舍入,稍后。


0
投票

要编写浮点数,我们必须将其重写为(-1)s 2e 1.m并以32位编码不同的部分,如下所示

C10

(来自0xC1000000

  • 第一位是符号s:0表示+,1表示 -
  • 8个跟随位是移位指数e + 127
  • 最后23位是尾数的小数部分(m)

困难的部分是将尾数转换为二进制。对于某些数字,这很容易。例如,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代码)

enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.