2016-06-02 30 views
-3

Ich habe einen einfachen Fibonacci-Sequenz-Generator geschrieben, die wie folgt aussieht:Unsigned lange lange Fibonacci-Zahlen negativ?

#include <iostream> 

void print(int c, int r) { 
    std::cout << c << "\t\t" << r << std::endl; 
} 

int main() { 
    unsigned long long int a = 0, b = 1, c = 1; 
    for (int r = 1; r <= 1e3; r += 1) { 
     print(c, r); 
     a = b; 
     b = c; 
     c = a + b; 
    } 
} 

jedoch als r um den Wert von 40 wird, seltsame Dinge zu passieren beginnen. c der Wert schwankt zwischen negativ und positiv, trotz der Tatsache, dass er eine unsigned Ganzzahl ist, und natürlich kann die Fibonacci-Sequenz nicht genau das sein.

Was passiert mit unsigned long long Ganzzahlen?

Wird c zu groß auch für eine long long Ganzzahl?

+3

Sie planen also, 1000. Fibonacci-Nummer in einer (möglicherweise) 64-Bit-Nummer zu speichern? 1000. Fibonacci-Nummer FYI ist: 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875. Sie sollten einige benutzerdefinierte Bigint Datentyp verwenden. –

+0

Wenn dies eine Option ist, ist Python eine gute Sprachwahl, weil es Bigint-Unterstützung eingebaut hat. –

Antwort

5

Sie haben eine einschränkende Konvertierung hier print(c, r); wo Sie print nur int ‚s nehmen definiert und hier übergeben Sie ein unsigned long long. Es ist eine Implementierung definiert.

die C++ Standard Draft Zitiert:

4.4.7:3: Wenn der Zieltyp signiert ist, ist der Wert unverändert, wenn es in dem Zieltyp dargestellt werden kann; andernfalls ist der Wert implementierungsdefiniert.

Aber was normalerweise passiert ist, dass: von der unsigned long long, nur die Bits, die gerade genug in eine int passen auf Ihre Funktion kopiert werden. Die abgeschnittenint wird in Twos complements gespeichert, je nach dem Wert der Most Significant Bit. Sie bekommen solche Abwechslung.

Ihre Funktion Signatur ändern unsigned long long

void print(unsigned long long c, int r) { 
    std::cout << c << "\t\t" << r << std::endl; 
} 

BTW zu erfassen, Mohit Jain's comment auf Ihre Frage zu sehen.

+0

Awww Ich fühle mich blöd :( – user6245072

+0

@ user6245072 Um sich nicht dumm zu fühlen, sollten Sie Compiler Warnungen lesen. – Drop