Man*_*ack 4 c++ casting visual-c++
考虑以下代码:
\n#include <iostream>\n\nusing namespace std;\n\nint main(int argc, char *argv[])\n{\n long double test = 0xFFFFFFFFFFFFFFFF;\n cout << "1: " << test << endl;\n unsigned long long test2 = test;\n cout << "2: " << test2 << endl;\n cout << "3: " << (unsigned long long)test << endl;\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n使用 GCC g++ (7.5.0) 编译此代码并运行会产生预期的以下输出:
\n1: 1.84467e+19\n2: 18446744073709551615\n3: 18446744073709551615\nRun Code Online (Sandbox Code Playgroud)\n但是,使用 Microsoft Visual C++ 编译器(16.8.31019.35,64 位和 32 位)对其进行编译并运行会产生以下输出:
\n1: 1.84467e+19\n2: 9223372036854775808\n3: 9223372036854775808\nRun Code Online (Sandbox Code Playgroud)\n将值转换为 an 时unsigned long long,MSVC\xe2\x80\x89编译器不会给出大于 a (signed) 最大值的值long long。
我做错了什么吗?\xe2\x80\x89
\n我是否遇到了我不知道的编译器限制?
\n有谁知道这个问题的可能解决方法?
\n因为 MSVClong double实际上只是 a double(正如 @drescherjm 在评论中指出的那样),所以它没有足够的精度来包含 0xFFFFFFFFFFFFFFFF 的精确值。当该值存储在 中时,long double它会“四舍五入”为大于 0xFFFFFFFFFFFFFFFF 的值。这会在转换为unsigned long long.