Unsigned Long Long out of range?

Ok, das ist ein komisches Problem :

  • Ich bin mit unsigned long long Variablen (ich habe sogar long lieben, mit dem gleichen Effekt)
  • Ich müssen speichern können 64-bit-Ganzzahlen (sizeof gibt 8, die ist in Ordnung)

Jedoch, wenn ich versuche zu gehen, um Werte wie 1<<63, und führen Sie einige einfache bitweise Operationen, I - seltsam zu sein scheinen immer negative Werte. Warum?

Mein test-code :

    unsigned long long c = 0;

    c |= 1l << 56; printf("c = %lld\n",c);
    c |= 1l << 63; printf("c = %lld\n",c);

Ausgabe :

c = 72057594037927936 
c = -9151314442816847872

Sidenotes :

  1. Natürlich, dasselbe passiert auch wenn ich c = 1l<<63 direkt.
  2. Alle tests auf Mac OS X 10.6 und zusammengestellt, mit der Apple LLVM Compiler 3.0

Irgendwelche Vorschläge?

  • Wenn Sie brauchen 64-bit-Ganzzahlen, Sie könnten es vorziehen, zu verwenden, uint64_t.
  • Ich weiß, Sie haben bereits ausgewählt ist, eine Antwort, aber ich habe noch eine Frage: Sind Sie kompilieren für ein 64-bit core? Was ist sizeof(long)? Ich bin überrascht, dass 1l<<63 funktioniert, als ich hätte gedacht, es wäre die Verlagerung einer 32-bit - 1l bis 63 bits, so dass Sie mit einem Wert von null. Aber wenn sizeof(long) ist auch 8, vielleicht das ist, warum es funktioniert. Wenn ich richtig bin, dann gibt es einige Wahrheit zu Jesse Rusak Antwort, obwohl die Antwort wäre nicht Ihr problem lösen.
  • Ja die 1l sollte wirklich 1ull garantieren, dass es mindestens 64 bits lang.
InformationsquelleAutor Dr.Kameleon | 2012-12-10
Schreibe einen Kommentar