Unsigned Long Long out of range?
Ok, das ist ein komisches Problem :
- Ich bin mit
unsigned long long
Variablen (ich habe sogarlong
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 :
- Natürlich, dasselbe passiert auch wenn ich
c = 1l<<63
direkt. - 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, dass1l<<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 wennsizeof(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 wirklich1ull
garantieren, dass es mindestens 64 bits lang.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
d
Teil der%lld
Planer sagtprintf
dass das argument behandelt werden sollte als eine vorzeichenbehaftete Ganzzahl. Verwenden Sie eineu
statt:%llu
.Aus der man-pages:
Ich glaube, du bist tatsächlich etwas zu tun undefined hier. Ich denke, der Ausdruck
1l << 63
ist undefiniert, in C, da der compiler darstellen1l
in einer signierten geben, und die Verlagerung von 63 bits bewirkt, dass einen signed überlauf (das ist undefiniert, in C). Ich bin kein Experte, aber scheint, wie Sie wollen1ull << 63
.Deinen original-code, in der Tat, klagt diese, wenn Sie passieren
-Weverything
im clang:EDIT: Und, ja, dann brauchen Sie die richtige printf-format von der anderen Antwort.