1

では 1/2/4 バイトの整数が返されeax、 では 8 バイトの整数が返されることはわかっていeax:edxます。

ところで、cdecl/stdcall で 4/8/16バイトの浮動小数点値(おそらくlong double16 バイトだったと記憶しています..)はどのように返されるのでしょうか?


@MatteoItalia のおかげで、VC++long doubleが 8 バイトであることを知りました。では、どうすれば 16 バイトの浮動小数点を使用できるでしょうか。

(「8 バイトだけを使用してください」とは言わないでください。本当に必要なのです。)

うーん、10バイトの浮動小数点でいいのかな…

4

2 に答える 2

4

FP の戻り値は、ST0 x87 レジスタに返されます (たとえば、こちらを参照)。

ちなみに、VC++ long double(x87 では 80 ビット) では、実質的にdouble.

于 2014-01-26T11:28:54.603 に答える
1

アーキテクチャを提供しませんでしたが、x86 は で浮動小数点値をST(0)返し、x86_64 は で返しXMM0ます。x86 呼び出し規約を参照してください

ただしlong double、x86 および x86_64 の VC はと同じでdoubleあり、これ以上の精度は提供されません。したがって、Windows で 80 ビット浮動小数点演算を行うには、GCC、Clang、ICCなどの別のコンパイラを使用する必要があります。また、80 ビット長の double は x87 によって計算されるため、優れた SSE ライブラリよりもパフォーマンスが低下する可能性があります。

10 バイトを超える long double が必要な場合は、独自の浮動小数点ライブラリを実装するか、いくつかの外部ライブラリを使用する必要があります。GCC 4.3 以降に__float128は、ソフト ライブラリを介したサポートが組み込まれています。long double (GCC 固有) および __float128を参照してください。

もう 1 つのアプローチは、double-doubleを使用して、PowerPC や SPARC のようにほぼ 4 倍精度の値を実装することです。IEEE との互換性はありませんが、ハードウェアの二重サポートを利用して高速化できるため、ソフトよりも高速になります。__float128

于 2014-01-26T14:50:04.550 に答える