rod*_*odi -2 floating-point assembly integer
每种编程语言都有自己的方法将整数转换为浮点数,将 01010 转换为其他 01010。如果您看到 ASM 生成的代码,它使用协处理器指令向用户隐藏真实值。
但实际情况如何呢?如何通过算法计算尾数、指数?
如果您了解浮点格式,您应该能够自己计算出该算法。
由于这个问题已被标记为assembly,因此这里是 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 代码。