2010-10-08 212 views
2

如果我有一个IEEE浮动十六进制42F6E979,我该如何将它转换为十进制?我相信十进制表示法是= 123.456001将IEEE浮点十六进制转换为十进制?

+5

什么汇编语言和体系结构? – 2010-10-08 15:45:24

+1

需要'家庭作业'标签? – 2010-10-08 15:49:27

+0

你的意思是ascii?如何从二进制浮点转换为人类可读的ascii? – 2010-10-09 05:11:12

回答

1

请参阅Wikipedia或调用可能已存在于您的环境中的库例程。这是一个经常重新发明的轮子

3

当您测试自己的代码时,可以使用this online tool来检查您的答案。供参考,你是正确的,小数点是123.45 ...

维基百科也有一个useful article以及。

+1

+1为链接到在线工具 - 非常有用。 – 2010-10-08 15:50:27

3

(大部分)汇编语言并不强制强制执行类型,因此您只需使用该值初始化一个位置,然后将其作为浮点处理/使用。要转换的最简单的方法通常是这样的:

.data 

myfloat dd 042F6E979H 
mydec db 10 dup(?) 

.code 

mov ebx, offset mydec  
fld myfloat 
fbstp [ebx] 

这实际上产生二进制编码的十进制,所以你必须每个字节分为两个数字来显示。当然,这是x86的 - 大多数其他架构使这项工作更加困难。例如,在PowerPC上,您有fctiw,它只是转换为整数(与x86 fist的常规顺序相同)。要使用它,通常会乘以10的倍数以获得所需的小数位数,然后转换为整数,并将小数点放在结果的正确位置。当/如果1)您接近浮点数范围的极限,或2)您想要的精度超过您在单个整数中可以表示的值时,它会变得有点难看。

0

我会在C中这样做,因为你没有提供语言。

char hex[]; 
int *ptr; 
for(int i = 0; i < 8; ++i) 
{ 
    &ptr += toNumber(hex[i]) << (i * 4); 
} 

float *value = (float*)ptr; 

我会留给OP编写toNumber函数。

+0

'&ptr + ='应该做什么?该地址的运营商不会给你一个左值。你的意思是'*(ptr ++)= something'的意思吗? 'ptr'如何初始化? – 2015-09-29 07:07:02