我正在寻找在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;
}
谢谢,
中号
答案 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次。