2

我正在寻找将在 Visual Studio 中采用 64 位双精度并将其转换为80 位扩展(IEEE-754)双精度的代码。结果应该存储在一个 10 字节的数组中(我想是小端格式)。原因是我需要将 80 位双精度发送到一个用 Borland c++ 编写的程序并要求这个双精度。但是我不知道该怎么做,因为我尝试过(基本上分别取 52 位和 11 位的尾数和指数,将指数转换为 15 位的 16383 偏移量并将尾数填充为 64 位)没有t 似乎工作。这是这个问题的反面。

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;
}

谢谢,

4

2 回答 2

3

内联汇编将是最简单和最快的方法。像这样:

void ConvertDoubleToLongDouble(double value, unsigned char result[10]) {
    __asm {
        fld value;
        mov ebx, result;
        fstp tbyte ptr [ebx];
    }
}
于 2012-04-26T07:56:27.187 回答
0
ul>>52&0x7FFF+15360

按位 & 的运算符优先级低于加法,这会给您带来意想不到的结果。

ull= ull&0xFFFFFFFFFFFFF;

您忘记将其向左移动 11 次。

于 2016-07-13T13:16:31.013 回答