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还是我的操作系统(Mac OS X 10.11)?
这是由溢出引起的。您的等式返回:250000500007500050000,这对于无符号长整型来说太大了。
clang处理这个问题的方式似乎与g++略有不同。我做了一个小测试,看看投完石膏后结果如何。
请参阅:Clang给出随机值,而g++返回std::numeric_limits<std::uint64_t>::max()
。
如果您需要这个数字(在数据类型中),我个人建议您找到一个支持任意长度数字(gmp或类似数字)的库。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 以0开头的值初始化long-long会导致奇怪的值
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- 为什么我的函数返回 long long 返回 705032704?
- 如何在 Turbo C++ 3.2 编译器中使用 long long 关键字
- "How to use long long data-type rather than pointers data-type to modify other variables ?"
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 如何处理计算中的"unsigned long long int"?
- 将long-long的数组转换为字符串
- unsigned int/signed int/long-long:无法解释的输出
- "long"和"long int"以及"long long"与"long long int"有什么区别
- map(long long int,long long int)不适用于key=1000 000 000(在long l
- 如果在我的机器上 sizeof(long) == sizeof(long long),为什么它们不是同一类型?
- long long value in Visual Studio
- C++定义了long-long,但输出是有限的
- Xcode clang编译器中的unsigned long-long意外行为