Xcode clang编译器中的unsigned long-long意外行为

unsigned long long unexpected behaviour in Xcode clang compiler

本文关键字:long-long 意外 unsigned clang 编译器 Xcode      更新时间:2023-10-16

我正在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还是我的操作系统(Mac OS X 10.11)?

这是由溢出引起的。您的等式返回:250000500007500050000,这对于无符号长整型来说太大了。

clang处理这个问题的方式似乎与g++略有不同。我做了一个小测试,看看投完石膏后结果如何。

请参阅:Clang给出随机值,而g++返回std::numeric_limits<std::uint64_t>::max()


如果您需要这个数字(在数据类型中),我个人建议您找到一个支持任意长度数字(gmp或类似数字)的库。

相关文章: