そのため、このトピックについて検索しましたが、実際に関連するものは何も見つかりませんでした。
この単純なコードの背後にあるアセンブリを見ようとしました:
int main(int argc, char *argv[])
{
double d = 1.0;
float f = static_cast<float>(d);
system("PAUSE");
return 0;
}
これは(Visual Studio 2012で):
15: double d = 1.0;
000000013FD7C16D movsd xmm0,mmword ptr [__real@3ff0000000000000 (013FD91AB0h)]
000000013FD7C175 movsd mmword ptr [d],xmm0
16: float f = static_cast<float>(d);
000000013FD7C17B cvtsd2ss xmm0,mmword ptr [d]
000000013FD7C181 movss dword ptr [f],xmm0
私は組み立てに慣れていませんが、とにかくそれを分析しようとしました。したがって、最初の 2 行は、倍精度値3ff0000000000000
をレジスタに移動し、次にレジスタの内容を d のメモリ アドレスに移動するように見えます。
次に、次の行が何をするのか正確にはわかりません。このcvtsd2ss
操作は、倍精度浮動小数点値を単精度浮動小数点値に変換する命令のようですが、この命令が実際に何をするのかわかりませんでした。(その後、変換された値は f のメモリ空間に移動されます)。
だから私の質問は、この命令によって実際にこの変換がどのように行われるのですか? C++ キャストが他の型で最も近い値を生成することは知っていますが、それ以外は、実行された実際の操作についてはわかりません...