我知道在 中返回 1/2/4 字节整数,在 中返回eax
8 字节整数eax:edx
。
顺便说一句,在 cdecl/stdcall 中如何返回 4/8/16字节浮点值(也许我记得long double
可能是 16 字节..) ?
感谢@MatteoItalia,我知道 VC++long double
是 8 字节的;那么,如何使用 16 字节的浮点数呢?
(不要说我“只使用 8 个字节!”。我真的需要它。)
嗯,我想我应该对 10 字节浮点数感到满意......
我知道在 中返回 1/2/4 字节整数,在 中返回eax
8 字节整数eax:edx
。
顺便说一句,在 cdecl/stdcall 中如何返回 4/8/16字节浮点值(也许我记得long double
可能是 16 字节..) ?
感谢@MatteoItalia,我知道 VC++long double
是 8 字节的;那么,如何使用 16 字节的浮点数呢?
(不要说我“只使用 8 个字节!”。我真的需要它。)
嗯,我想我应该对 10 字节浮点数感到满意......
FP 返回值在 ST0 x87 寄存器中返回(参见例如此处)。
顺便说一句,在 VC++ long double
(在 x87 中是 80 位)实际上是double
.
您没有提供架构,但 x86 在中返回浮点值,ST(0)
而 x86_64 在中返回XMM0
。请参阅x86 调用约定
但是long double
在 x86 和 x86_64 的 VC 中是相同的,double
并且不会为您提供更多的精度。所以在 Windows 上做 80 位浮点运算你需要使用另一个编译器,例如GCC、Clang 或 ICC。此外,x87 计算了 80 位 long double,因此它的性能可能比好的 SSE 库差。
如果您需要超过 10 字节的 long double,那么您必须实现自己的浮点库或使用一些外部库。GCC 4.3 及更高版本__float128
通过软库内置支持。请参阅long double(特定于 GCC)和 __float128
另一种方法是使用double-double来实现接近四倍的精度值,例如在 PowerPC 或 SPARC 中。它不兼容 IEEE,但您可以利用硬件双重支持来加速,因此它会比软件更快__float128