所以我搜索了这个主题,但没有找到真正相关的内容。
我尝试查看这个简单代码背后的汇编:
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++的强制类型转换会产生最接近另一种类型的值,但除此之外,我对实际执行的操作一无所知...