从整数到浮点数的转换是如何进行的?

rod*_*odi -2 floating-point assembly integer

每种编程语言都有自己的方法将整数转换为浮点数,将 01010 转换为其他 01010。如果您看到 ASM 生成的代码,它使用协处理器指令向用户隐藏真实值。

但实际情况如何呢?如何通过算法计算尾数、指数?

Jes*_*ter 5

如果您了解浮点格式,您应该能够自己计算出该算法。

  1. 如果输入为0,则结果为全0位。
  2. 如果输入为负,则将符号位设置为1,并对输入求反。
  3. 找到最高位组。将偏差添加到其索引中,这将是您的指数。
  4. 清除最高位设置,剩下的是尾数。

由于这个问题已被标记为,因此这里是 x86 的示例实现:

int_to_float:
    xor eax, eax
    mov edx, [esp+4]
    test edx, edx
    jz .done
    jns .pos
    or eax, 0x80000000 ; set sign bit
    neg edx
.pos:
    bsr ecx, edx
    ; shift the highest bit set into bit #23
    sub ecx, 23
    ror edx, cl         ; works for cl < 0 too
    and edx, 0x007fffff ; chop off highest bit
    or eax, edx         ; mantissa
    add ecx, 127 + 23   ; bias
    shl ecx, 23
    or eax, ecx         ; exponent
.done:
    ret
Run Code Online (Sandbox Code Playgroud)

注意:这会返回 中的浮点数eax,而调用约定通常要求st0。我只是想完全避免 FPU 代码。