所以我搜索了这个主题,并没有发现任何与它真正相关的内容。
我试图查看这个简单代码背后的程序集:
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
我对组装不太满意,但无论如何我都试图分析它。所以前两行似乎是将双精度值移动3ff0000000000000
到寄存器中,然后将寄存器的内容移动到d的内存地址。
然后,我只是不知道下一行是什么。该cvtsd2ss
操作显然是将双精度浮点值转换为单精度浮点值的指令,但我找不到该指令的实际作用。(然后将转换后的值移动到 f 的内存空间)。
所以我的问题是,这个转换实际上是如何通过这条指令完成的?我知道 C++ 强制转换会在另一种类型中产生最接近的值,但除此之外,我不知道实际执行的操作......