【问题标题】:Convert decimal to hex/binary将十进制转换为十六进制/二进制
【发布时间】:2012-06-26 01:10:34
【问题描述】:

我有一道小数学题。

有没有办法将十进制数(例如 3.14)转换为十六进制或二进制?如果可能的话,有人可以在这里放置一些教程或解释的链接吗? (我不希望它用于某种语言,我通常在数学中需要它。)请帮助。

编辑

在代码中传递的输入:

0.1

ASM 代码中的输出:

415740h

另一个输入:

0.058

编译器的另一个输出:

00415748h

但是这是怎么做到的呢?怎么转换?

【问题讨论】:

  • 我不希望它用于某些语言,我通常在数学中需要它。结帐:math.stackexchange.com
  • D 先生 - 我的意思是带逗号的数字(例如 5,21651526)
  • 您不能将浮点数转换为十六进制或二进制。只有自然数起作用。它是十六进制的(以 10 为底-> 以 16 为底),因此,如果您想要浮点数,则必须在其中使用浮点数,例如 FF、EA09。但是没有人使用它
  • 那么 double/float 是如何工作的?它们由编译器翻译成十六进制。我在反汇编代码中看到它...

标签: math floating-point binary hex decimal


【解决方案1】:

【讨论】:

  • Here is Binary to Hex 您只需将每4个二进制数字转换为1HEX
  • 它用于带有逗号的数字 - 浮点数。它们以 32 位(或 64b 为双精度位)存储。第一位是符号(0=+/1=-),然后是 8 位指数(-127 - +127),其余是归一化数(没有“1”)。
【解决方案2】:

我无法将您的输出样本识别为浮点数的编码或 .1 和 .058 的其他常见表示形式。我怀疑这些数字是汇编器或编译器存储浮点编码的地址。

换句话说,您编写了一些包含浮点文字的文本,汇编器或编译器将该文字转换为浮点编码,将其存储在某个地址,然后将该地址放入加载的指令中内存中的浮点编码。

这个假设与这两个数字相差 8 的事实是一致的。由于双精度浮点数通常为 8 个字节,因此第二个地址 (0x415748) 比第一个地址 (0x415740) 多 8 个字节。

浮点数编码的过程大致是这样的:

设 x 为要编码的数字。

如果 x 为正,则将 s(符号位)设置为 0,如果 x 为负,则设置为 1。将 x 设置为 x 的绝对值。

将 e(指数)设置为 0。重复以下任何适当的操作:

  • 如果 x 大于或等于 2,则将 1 加到 e 并除以 2。重复直到 x 小于 2。
  • 如果 x 小于 1,则将 -1 加到 e 中,然后将 x 乘以 2。重复直到 x 至少为 1。

完成上述操作后,x 至少为 1 且小于 2。此外,原始数字等于 (-1)s·2e ·X。也就是说,我们用符号位 (s)、2 的指数 (e) 和有效位 (x) 来表示数字,它在 [1, 2) 中(包括 1,不包括 2)。

设置 f = (x-1)·252。将 f 舍入到最接近的整数(如果它是两个整数之间的平局,则舍入到偶数)。如果 f 现在是 252,则将 f 设置为 0 并将 e 加 1。 (此步骤查找 x 表示为二进制数字时紧跟“小数点”之后的 52 位,并在第 52nd 位后四舍五入,如果四舍五入则调整指数该位置将 x 向上舍入为 2,这超出了我们想要的区间。)

将 1023 添加到 e。这对于 x 没有数值意义;它只是浮点编码的一部分。解码时,减去 1023。

现在,将 s、e 和 f 转换为二进制数字,s 使用 1 位数字,e 使用 11 位数字,f 使用 52 位数字。如有必要,包括前导零,以便 e 用 11 个二进制数字表示,f 用 52 个二进制数字表示。连接这些数字,你就有了 64 位。这是双精度浮点数的常见 IEEE 754 编码。

有一些特殊情况:如果原始数字为零,则对 s、e 和 f 使用零。 (s 也可以是 1,表示一个特殊的“负零”。如果在添加 1023 之前,e 小于 -1022,则必须进行一些调整以获得“非正规”结果或零,我没有现在进一步描述。如果在加1023之前,e大于1023,那么这个数字的大小太大而无法用浮点数表示。可以通过设置e(加1023后)将其编码为无穷大到 2047 和 f 到零。

【讨论】:

  • '将 x 设置为 x 的绝对值' - 你是什么意思?
  • 无论 x 的值是多少,取其绝对值,并将 x 更改为该值。因此,如果 x 为 -3,则将其设置为 3。如果 x 为 3,则将其设置为 3(没有变化)。这一步的目的只是为了去掉符号,以便后面的步骤只需要处理正数。例如,以下步骤之一计算指数并将 x 调整为在 [1, 2) 中。如果必须编写该步骤以将正 x 调整为在 [1, 2) 中,将负 x 调整为在 (-2, 1] 中,那将更加复杂。因此,在这个早期步骤中,我们要记住符号(in s) 并将其从 x 中删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2014-10-30
  • 2016-08-28
  • 2013-07-25
相关资源
最近更新 更多