J'essaie quelque chose sur mon Mac OS X XCode 7.2.1 -un comportement inattendu unsigned long long dans le compilateur Xcode clang
#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;
Ainsi, la sortie est censé être -
value: 18446744073709551615
ULLONG_MAX: 18446744073709551615
Mais la la sortie est -
value: 0
ULLONG_MAX: 18446744073709551615
Les changements ci-dessous n'ont pas fait de différence.
uint64 N = 100000ull;
uint64 value = (pow(N, 4ull) + 2ull * pow(N, 3ull) + 3ull * pow(N, 2ull) + 2ull * N)/4ull;
exécution gcc --version
commande sur mes rendements terminaux -
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
J'ai essayé code ci-dessus dans HackerRank g ++ 4.9.2 compilateur et la sortie était correcte.
Que se passe-t-il sous le capot? Est-ce Clang ou mon OS (Mac OS X 10.11)?
Si vous affectez à 'long double' à la place, vous verrez que le résultat est _not_' ULLONG_MAX'. Au lieu de cela, il déborderait. 'long double valeur = pow (N, 4.0L) + 2.0L * pow (N, 3.0L) + 3.0L * pow (N, 2.0L) + 2.0L * N)/4.0L;' – paddy
Merci :) 'long double' peut contenir plus de données, ce qui est certainement utile pour vérifier si un débordement se produit dans ce cas. –