在Visual Studio中以字节数组形式将64位双精度转换为80位双精度

时间:2012-04-26 05:17:32

标签: c++ visual-studio-2010 visual-c++ floating-point double

我正在寻找在visual studio中使用64位双精度并将其转换为80-bit extended (IEEE-754)双精度的代码。结果应该存储在一个10字节的数组中(我想象的是小端格式)。原因是我需要将80位双精度发送到一个用Borland c ++编写的程序,并要求这个双精度数。但我不知道如何做到这一点,因为我尝试了(基本上分别采用52和11位的尾数和指数,转换指数,使其为15位的16383偏移,并将尾数填充为64位)似乎工作。它是this question的倒数。

inline void ConvertDblToLongDbl(double dbl, unsigned char aCh[10])
{
__int64 ull= *(__int64*)(&dbl);
    *(unsigned short*)&aCh[8]= (unsigned short)((ull>>52&0x7FF+15360)|  //     exponent, from 11 bits to 15 bits
        ((ull&(__int64)1<<63)?0x8000:0));   // sign, the 16th bit
    ull= ull&0xFFFFFFFFFFFFF;
    *(__int64*)&aCh[0]= ull|0x8000000000000000;
}

谢谢,
中号

2 个答案:

答案 0 :(得分:3)

内联汇编将是最简单,最快捷的方式。像这样:

void ConvertDoubleToLongDouble(double value, unsigned char result[10]) {
    __asm {
        fld value;
        mov ebx, result;
        fstp tbyte ptr [ebx];
    }
}

答案 1 :(得分:0)

ul>>52&0x7FFF+15360

按位&amp;运算符优先级低于加法运算符,给出意外结果。

ull= ull&0xFFFFFFFFFFFFF;

你忘了把这个左移11次。