Vì vậy, tôi đã tìm kiếm về chủ đề này và không tìm thấy gì thực sự liên quan về nó.Làm thế nào để chuyển đổi dấu chấm động thực sự được thực hiện trong C++? (Double to float hoặc float to double)
Tôi đã cố gắng để nhìn vào lắp ráp đằng sau mã đơn giản này:
int main(int argc, char *argv[])
{
double d = 1.0;
float f = static_cast<float>(d);
system("PAUSE");
return 0;
}
đó là (với Visual Studio 2012):
15: double d = 1.0;
000000013FD7C16D movsd xmm0,mmword ptr [[email protected] (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
tôi không phải là thoải mái với lắp ráp nhưng cố gắng phân tích điều đó. Vì vậy, hai dòng đầu tiên dường như di chuyển giá trị chính xác kép 3ff0000000000000
vào sổ đăng ký, và sau đó di chuyển nội dung của thanh ghi đến địa chỉ bộ nhớ của d.
Sau đó, tôi chỉ không biết chính xác những gì các dòng tiếp theo. Các hoạt động cvtsd2ss
rõ ràng là một hướng dẫn rằng convert double precision floating point value to single precision floating point value nhưng tôi không thể tìm thấy những gì hướng dẫn này thực sự. (Sau đó, giá trị được chuyển đổi được chuyển đến không gian bộ nhớ của f).
Câu hỏi của tôi là, chuyển đổi này thực sự được thực hiện như thế nào theo hướng dẫn này? Tôi biết rằng các diễn viên C++ sẽ mang lại giá trị gần nhất trong loại khác nhưng ngoài ra, tôi không có ý tưởng về các hoạt động thực tế ...
"Tôi biết rằng diễn viên C++ sẽ mang lại giá trị gần nhất ở loại khác". Nhiều hơn những gì bạn cần biết? –
[Hướng dẫn dành cho nhà phát triển phần mềm của Intel] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) Tập 2. –
Bạn có thể muốn đọc về nó trong [Tham khảo Kiến trúc Intel] (http://download.intel.com/products/processor/manual/325462.pdf) (Cảnh báo: PDF lớn), đặc biệt là bắt đầu từ trang 241. –