【问题标题】:Convert IEEE float hex to decimal?将IEEE浮点十六进制转换为十进制?
【发布时间】:2010-10-08 15:41:42
【问题描述】:

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

【问题讨论】:

  • 什么汇编语言和架构?
  • 你的意思是ascii吗?如何从二进制浮点数转换为人类可读的 ascii?

标签: assembly floating-point ieee-754


【解决方案1】:

(大多数)汇编语言实际上并没有非常严格地强制执行类型,因此您可以使用该值初始化一个位置,然后将其视为/使用它作为浮点数。最简单的转换方法通常是这样的:

.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)您想要比单个整数表示的精度更高时,它可能会变得有点难看。

【讨论】:

    【解决方案2】:

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

    维基百科也有useful article

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我将在 C 中执行此操作,因为您尚未提供语言。

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

        我将把它留给 OP 来编写 toNumber 函数。

        【讨论】:

        • &amp;ptr += ... 到底应该做什么? address-of 运算符不会为您提供左值。你的意思是像*(ptr++) = something这样的东西吗? ptr是如何初始化的?
        猜你喜欢
        • 2014-03-01
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        • 2011-03-05
        • 2016-04-02
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多