Ich versuche, etwas auf meinem Mac OS X XCode 7.2.1 -unsigned long long unerwartetes Verhalten in Xcode Klirren Compiler
#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;
So ist der Ausgang sein soll -
value: 18446744073709551615
ULLONG_MAX: 18446744073709551615
Aber die Ausgabe ist -
value: 0
ULLONG_MAX: 18446744073709551615
Auch unten Änderungen machten keinen Unterschied.
uint64 N = 100000ull;
uint64 value = (pow(N, 4ull) + 2ull * pow(N, 3ull) + 3ull * pow(N, 2ull) + 2ull * N)/4ull;
Lauf gcc --version
Befehl auf meinem Gerät liefert -
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
ich oben Code versucht in Hackerrank g ++ 4.9.2 Compiler und die Ausgabe korrekt war.
Was passiert unter der Haube? Ist es Clang oder mein Betriebssystem (Mac OS X 10.11)?
Wenn Sie stattdessen 'long double' zuweisen, sehen Sie, dass das Ergebnis _not_' ULLONG_MAX' ist. Stattdessen würde es überlaufen. 'langer doppelter Wert = pow (N, 4.0L) + 2.0L * pow (N, 3.0L) + 3.0L * pow (N, 2.0L) + 2.0L * N)/4.0L;' – paddy
Danke :) 'long double' kann mehr Daten enthalten, was sicherlich hilfreich ist, um zu überprüfen, ob in diesem Fall ein Überlauf auftritt. –