2012-06-24 485 views
0

我有一个小数学问题。将十进制转换为十六进制/二进制

有什么办法将十进制数(例如3.14)转换为十六进制或二进制?如果可能的话,任何人都可以在这里找到一些教程或exaplanations的链接? (我不想要某种语言,我通常需要数学。)请帮忙。

EDIT

在输入代码通过:

0.1 

输出在ASM代码:

415740h 

另一输入:

0.058 

编译器的另一个输出:

00415748h 

但是这样做了怎么样?它如何转换?

+0

http://www.wikihow.com/Convert-from-Decimal-to-Binary –

+0

_我不希望它的某些语言,我通常需要在数学。结帐: http://math.stackexchange.com/ – Anne

+0

先生D - 我的意思是用逗号分隔的数字(例如5,21651526) – user35443

回答

2

我不认识你的输出样本为浮点数或1.1和0.058等共同表示的编码。我怀疑这些数字是汇编器或编译器存储浮点编码的地址。

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

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

在浮点编码数的方法,大致是这样的:

设X是要被编码的数目。

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

集合E(指数)为0,重复取以下是适当的:

  • 如果x为2或更大,通过2.重复添加1〜e和除法X直到x小于2.
  • 如果x小于1,添加-1至e和直到x是至少为1

当你与上述完成通过2.重复乘以X,X为至少1并且小于2.此外,原始数字等于(-1)s·2 e·x。也就是说,我们用一个符号位(s)和两个(e)的指数以及[1,2](包括1,不包括2)中的一个有效位数(x)来表示数字。

设置f =(x-1)·2 。将f四舍五入到最接近的整数(如果它是两个整数之间的连接,则转换为偶数整数)。如果f现在为2 ,则将f设置为0并将1加1。 (当x被表示为一个二进制数字时,这一步找到紧接着“小数点”之后的x位的52位,并且在数位之后舍入,并且如果在该位置四舍五入舍入x则调整指数到2,这是我们想要它的间隔)

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

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

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

+0

'将x设置为x的绝对值 - 你是什么意思? – user35443

+0

无论x的值是什么,取其绝对值,并将x改为具有该值。因此,如果x为-3,则将其设置为3.如果x为3,则将其设置为3(不变)。这一步的目的仅仅是去除符号,以便下面的步骤只需要处理正数。例如,以下步骤之一计算出指数并将x调整为[1,2]。如果必须写出这一步来调整正数x在[1,2]中且负数x在(-2,1)中,那么它会更加复杂。因此,在这个早期阶段,我们记住了符号(在s中)并从x中删除它。 –

0
+0

[这里是二进制到十六进制](http://sandbox.mc.edu/~bennet/cs110/convexamp/binhex.html) 您只需简单地将每4个二进制数字转换为1HEX – matskiv

+0

但是,我的意思是数字用逗号(例如5,21651526)... – user35443

+0

它是用逗号分隔的数字 - 浮点数。它们存储在32位(或64b双)。第一位是符号(0 = +/1 = - ),然后8位指数(-127 - +127),其余为归一化数字(不带“1”)。 – matskiv

相关问题