从 long double 到 unsigned long long 的转换在 MSVC C++ 编译器中似乎被破坏

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}\n
Run Code Online (Sandbox Code Playgroud)\n

使用 GCC g++ (7.5.0) 编译此代码并运行会产生预期的以下输出:

\n
1: 1.84467e+19\n2: 18446744073709551615\n3: 18446744073709551615\n
Run Code Online (Sandbox Code Playgroud)\n

但是,使用 Microsoft Visual C++ 编译器(16.8.31019.35,64 位和 32 位)对其进行编译并运行会产生以下输出:

\n
1: 1.84467e+19\n2: 9223372036854775808\n3: 9223372036854775808\n
Run Code Online (Sandbox Code Playgroud)\n

将值转换为 an 时unsigned long long,MSVC\xe2\x80\x89编译器不会给出大于 a (signed) 最大值的值long long

\n

我做错了什么吗?\xe2\x80\x89

\n

我是否遇到了我不知道的编译器限制?

\n

有谁知道这个问题的可能解决方法?

\n

Man*_*ack 6

因为 MSVClong double实际上只是 a double(正如 @drescherjm 在评论中指出的那样),所以它没有足够的精度来包含 0xFFFFFFFFFFFFFFFF 的精确值。当该值存储在 中时,long double它会“四舍五入”为大于 0xFFFFFFFFFFFFFFFF 的值。这会在转换为unsigned long long.