将32位浮点数转换为IEEE 80位

时间:2011-01-06 12:13:56

标签: c++ assembly floating-point double

我正在尝试将32位浮点数转换为扩展精度80位浮点数。 我正在使用MSVC x86。我尝试了以下内联ASM代码:

void Convert32To80(float *value, void *outValue)
{
    __asm
    {
        fld float ptr [value];
        fstp tbyte ptr [outValue];
    }
}

这里,void *outValue是一个足以容纳10个字节的缓冲区。 这对我来说是正确的,但它在运行时会崩溃。

感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

好的,这应该这样做:

void Convert32To80(float *value, void *outValue)
{
    __asm
    {
        mov eax,dword ptr [value] 
        fld dword ptr [eax] 
        mov ecx,dword ptr [outValue] 
        fstp tbyte ptr [ecx] 
    }
}

我所做的只是写了一些C代码来做同样的事情,但是对于浮动到双重转换,查看了dissasembly,然后根据需要进行了修改。

请注意,我不是MSVC的专家,我不能100%确定我可以使用EAX和ECX寄存器,而不保存/恢复它们。其他人可能知道更多并提供更正。

答案 1 :(得分:1)

更新后人注意事项:显然,MSVC 2010没有80bit浮点类型的类型,因此C或C ++代码中的显而易见的解决方案

float inValue = 666.666f;
long double outValue = (long double)inValue;

不起作用,实际上你被迫直接使用汇编语言。