Xcode clang 编译器中的 unsigned long long 意外行为
unsigned long long unexpected behaviour in Xcode clang compiler
我正在 Mac OS X XCode 7.2.1 -
上尝试一些东西
#define uint64 unsigned long long
int N = 100000;
uint64 value = (pow(N, 4) + 2 * pow(N, 3) + 3 * pow(N, 2) + 2 * N) / 4;
cout << "value: " << value << endl; // this is equivalent to ULLONG_MAX (18446744073709551615)
cout << "ULLONG_MAX: " << ULLONG_MAX << endl;
所以输出应该是 -
value: 18446744073709551615
ULLONG_MAX: 18446744073709551615
但是输出是-
value: 0
ULLONG_MAX: 18446744073709551615
下面的更改也没有任何区别。
uint64 N = 100000ull;
uint64 value = (pow(N, 4ull) + 2ull * pow(N, 3ull) + 3ull * pow(N, 2ull) + 2ull * N) / 4ull;
运行 gcc --version
我终端上的命令产生 -
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.0.0
Thread model: posix
我在 Hackerrank g++ 4.9.2 编译器中尝试了上面的代码,输出是正确的。
引擎盖下发生了什么?是 Clang 还是我的 OS(Mac OS X 10.11)?
这是溢出造成的。您的等式 returns: 25000500007500050000 对于 unsigned long long 来说太大了。
clang 处理这个问题的方式似乎与 g++ 略有不同。我做了一个小测试,看看投射后的结果如何。
参见:Clang giving random values while g++ returns std::numeric_limits<std::uint64_t>::max()
。
如果你需要这个数字(在数据类型中),我个人建议找一个支持任意长度数字的库(gmp 或类似的)。
我正在 Mac OS X XCode 7.2.1 -
上尝试一些东西#define uint64 unsigned long long
int N = 100000;
uint64 value = (pow(N, 4) + 2 * pow(N, 3) + 3 * pow(N, 2) + 2 * N) / 4;
cout << "value: " << value << endl; // this is equivalent to ULLONG_MAX (18446744073709551615)
cout << "ULLONG_MAX: " << ULLONG_MAX << endl;
所以输出应该是 -
value: 18446744073709551615
ULLONG_MAX: 18446744073709551615
但是输出是-
value: 0
ULLONG_MAX: 18446744073709551615
下面的更改也没有任何区别。
uint64 N = 100000ull;
uint64 value = (pow(N, 4ull) + 2ull * pow(N, 3ull) + 3ull * pow(N, 2ull) + 2ull * N) / 4ull;
运行 gcc --version
我终端上的命令产生 -
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.0.0
Thread model: posix
我在 Hackerrank g++ 4.9.2 编译器中尝试了上面的代码,输出是正确的。
引擎盖下发生了什么?是 Clang 还是我的 OS(Mac OS X 10.11)?
这是溢出造成的。您的等式 returns: 25000500007500050000 对于 unsigned long long 来说太大了。
clang 处理这个问题的方式似乎与 g++ 略有不同。我做了一个小测试,看看投射后的结果如何。
参见:Clang giving random values while g++ returns std::numeric_limits<std::uint64_t>::max()
。
如果你需要这个数字(在数据类型中),我个人建议找一个支持任意长度数字的库(gmp 或类似的)。