Definition von array mit long long int
Ich versuche zu generieren, die ein array, das eine Potenz von 2 ist von 2^0 bis 2^63. Ich bin mit unsigned long long int für diese. Aber wenn ich drucken Sie alle Werte, die er den Druck, bis 2^30 und dann ist es überlaufen. Compiler GNU GCC version 4.8.1. Hier ist der code.
unsigned long long int a[65],i;
a[0]=1;
for(i=1;i<65;i++) {
a[i]=2<<(i-1);
printf("i=%d a[i]=%lld\n",i, a[i]);
}
Hier ist die Ausgabe
i=1 a[i]=2
i=2 a[i]=4
i=3 a[i]=8
i=4 a[i]=16
i=5 a[i]=32
i=6 a[i]=64
i=7 a[i]=128
i=8 a[i]=256
i=9 a[i]=512
i=10 a[i]=1024
i=11 a[i]=2048
i=12 a[i]=4096
i=13 a[i]=8192
i=14 a[i]=16384
i=15 a[i]=32768
i=16 a[i]=65536
i=17 a[i]=131072
i=18 a[i]=262144
i=19 a[i]=524288
i=20 a[i]=1048576
i=21 a[i]=2097152
i=22 a[i]=4194304
i=23 a[i]=8388608
i=24 a[i]=16777216
i=25 a[i]=33554432
i=26 a[i]=67108864
i=27 a[i]=134217728
i=28 a[i]=268435456
i=29 a[i]=536870912
i=30 a[i]=1073741824
i=31 a[i]=-2147483648
i=32 a[i]=0
i=33 a[i]=2
i=34 a[i]=4
i=35 a[i]=8
i=36 a[i]=16
i=37 a[i]=32
i=38 a[i]=64
i=39 a[i]=128
i=40 a[i]=256
i=41 a[i]=512
i=42 a[i]=1024
i=43 a[i]=2048
i=44 a[i]=4096
i=45 a[i]=8192
i=46 a[i]=16384
i=47 a[i]=32768
i=48 a[i]=65536
i=49 a[i]=131072
i=50 a[i]=262144
i=51 a[i]=524288
i=52 a[i]=1048576
i=53 a[i]=2097152
i=54 a[i]=4194304
i=55 a[i]=8388608
i=56 a[i]=16777216
i=57 a[i]=33554432
i=58 a[i]=67108864
i=59 a[i]=134217728
i=60 a[i]=268435456
i=61 a[i]=536870912
i=62 a[i]=1073741824
i=63 a[i]=-2147483648
i=64 a[i]=0
Habe ich auch versucht, mit Hilfe int64_t, aber die Ergebnisse waren die gleichen. Auch wenn ich es normalerweise tun someting wie
unsigned long long int lli = 9223372036854775807;
und den Druck seiner Wert, es funktioniert. Wo mache ich falsch?
- dies kann sehr aufschlussreich sein. stackoverflow.com/questions/1523483/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist dieser code:
a[i] = 2 << (i-1);
2
ist davon ausgegangen, der Typint
weil es 32bit in den meisten Compiler von C++.Müssen Sie überschreiben diese mit.
a[i] = 2ULL << (i-1);
Müssen Sie Besondere Vorsicht bei Arten verwendet, die mit der Verschiebung der Betreiber, die Verlagerung von mehr bits, das die Größe der Operanden Undefiniert Verhalten und alles geschehen könnte hier (Beispiel), mit Literale weitere Vorsichtsmaßnahme werden müssen, weil die vergessen haben das suffix.
Die anderen Antworten haben die Frage bereits beantwortet Sie Fragen, aber es gibt einige andere Probleme in Ihrem code.
Erweitern auf die anderen Antworten, Bedenken Sie, dass der Typ eines C-Ausdrucks ist in der Regel bestimmt durch den Ausdruck selbst, nicht durch den Kontext, in dem es erscheint. Sie haben:
Die Tatsache, dass die linke Seite der Zuweisung ist der Typ
unsigned long long int
hat keinen Einfluss auf die Auswertung der rechten Seite, die vom Typint
, und die<<
Ergebnisse in einerint
überlauf.Gibt es keine Notwendigkeit, Sie zu behandeln element 0 des Arrays als ein besonderer Fall.
Eher als
2 << (i-1)
oder mehr richtig2ULL << (i-1)
, es ist einfacher zu schreiben1ULL << i
.Bist du mit dem falschen
printf
format-Zeichenfolgen für Ihre Variablen.i
ist der Typunsigned long long
;"%d"
erfordert ein argument des Typsint
. Aber dai
nur zählt von 0 bis 65 Jahren, es könnte genauso gut einint
. Die Elemente dera
Typunsigned long long int
, aber du bist mit dem format für unterzeichnetlong long int
.Hier ist eine modifizierte version von Ihr
Programmcode-snippet, ausgearbeitet bis ein vollständiges Programm, und mit der oben genannten Probleme korrigiert:Das Problem ist diese Zeile:
Den
2
ist ein integer-literal und so das Ergebnis ist ein int nicht ein unsigned long long können Sie dieULL
suffix dieses Problem zu beheben.Dies ist auch zu undefiniertem Verhalten zu einem shift gleich eine größere als die bit-Länge der geförderten linken Operanden. Sie haben auch zu undefiniertem Verhalten in Ihrer Nutzung
printf
. Sie verwenden das falsche format specifier, in beiden Fällen sollten Sie mit Hilfe%llu
.Mit der rechten Warnsignale wohl würde Euch geholfen haben, catch-all diese bugs, die zum Beispiel mit den folgenden flags
-fsanitize=undefined -Wall -Wextra -Wconversion -pedantic
mitclang
gibt die folgenden Warnungen:und die folgenden run-time Fehlermeldung: