long long int Typ

Die Angabe long long ist eine Modifikation des int-Typs. Ein long long int speichert einen ganzzahligen Wert, welcher heutzutage normalerweise mit 64 Bits codiert wird. Wenn immer möglich sollte anstelle dieses Typs ein Integer-Typ mit expliziter Anzahl Bits aus der stdint-Bibliothek verwendet werden.

Details

Ein long long int oder kurz long long wird auf den heute gängigen Systemen mit 64 Bits codiert. Diese Grössenangabe ist jedoch nicht garantiert, sondern wird auf dieser Seite nur als Richtlinie angegeben, auch wenn insbesondere auf älteren Systemen ein long long manchmal nur mit 32 Bits codiert wurde oder überhaupt nicht vorhanden war. Der Typ long long wurde mit dem Standard C99 eingeführt und bezeichnet eine wirklich lange Ganzzahl im dem Sinne, dass die grösstmögliche Ganzzahl dieses Typs im Vergleich zu einem normalen int viel mehr Ziffern besitzt.

Der Typ long long long ist zu lang.

Heutzutage werden Typ-Modifikatoren wie short, long oder long long immer seltener verwendet, da ab dem C99-Standard mit der stdint-Bibliothek viele Integer-Typen mit genaueren Angaben zur Anzahl Bits zur Verfügung stehen.

Ein long long-Typ kann entweder mit signed oder unsigned modifiziert werden. Je nachdem speichert ein long long entweder sowohl negative als auch positive Werte, oder aber explizit nur positive. Wird der Modifikator weggelassen, wird vom Compiler standardmässig signed angenommen. Ob der Modifikator vor oder nach dem Typ steht und ob die beiden long-Keywords nebeneinander stehen, spielt keine Rolle. Genauso spielt es keine Rolle, wo der Typbezeichner int steht und ob er nicht gar weggelassen wird.

long long               a;
long long int           b;
signed long long        c;
long signed long        d;
unsigned long int long  e;

Positive Werte werden als binäre Ganzzahl gespeichert. Die negativen Werte eines signed long long werden auf heutigen Computern üblicherweise mittels des Zweierkomplements codiert.

Die maximal und minimal möglichen Werte eines long long sind in der limits-Bibliothek definiert.

Wird durch eine arithmetische Operation der Wertebereich eines long long überschritten, so wird dies als Overflow bezeichnet. Auf heutigen Prozessoren kippt dabei eine Ganzzahl mit Vorzeichen vom positiven plötzlich in den negativen Bereich und bei vorzeichenlosen Ganzzahlen folgt auf den maximalen Wert plötzlich die Zahl 0 (Null). Dies wird als Wrap-Around bezeichnet. Analog dazu wird das Unterschreiten des Wertebereiches als Underflow bezeichnet und der Wrap-Around passiert vice versa. Dass dieser Effekt jedoch auf jedem System auftritt, ist nicht garantiert.

Bei der Angabe von festen Werten im Quellcode sollten long long-Werten kleine ll oder grosse LL als Suffix angehängt werden. Beide Suffixe bedeuten dasselbe, auf dieser Seite wird jedoch stets die Grossbuchstaben-Variante verwendet, damit keine Verwechslungsgefahr mit der Ziffernfolge 11 (eins-eins) besteht.

9999999987654321ll
9999999987654321LL
9999999987654321
lowercase suffix
uppercase suffix
no suffix: integer constant overflow

Um einen festen Wert explizit als unsigned zu kennzeichnen, kann das Suffix u verwendet werden.

Heutige Compiler geben normalerweise Warnungen aus, wenn feste Werte zu gross für einen int sind und mittels Suffix als ein long long gekennzeichnet werden sollten. Manche Compiler warnen gar, wenn eine Zahl so gross ist, dass sie nicht mehr als signed long long gespeichert werden kann. Wenn eine Zahl sogar den Wertebereich eines unsigned long long übersteigt, wird ebenfalls eine Warnung (aber nicht zwingend ein Fehler) ausgegeben. Das Verhalten bei einer so grossen Zahl während der Laufzeit ist unbestimmt.

Um einen long long mit printf auszugeben oder mit scanf einzulesen, wird der Modifikator ll (zwei kleine L) verwendet:


123
long long L = 123;
printf("%lld\n", L);

Arithmetische Umwandlung

Bei Zuweisungen, Initialisierungen oder Casts zu einem long long-Typ werden durch den Compiler gegebenfalls arithmetische Umwandlungen durchgeführt. Im folgenden sind die Umwandlungsregeln für den long long-Typ beschrieben. Bei unsicheren Umwandlungen gibt ein Compiler üblicherweise eine Warnung aus, welche jedoch bei Bedarf mittels eines expliziten Casts unterdrückt werden kann.

Bei der Umwandlung eines Fliesskomma-Typs in einen long long werden die Nachkommastellen schlicht abgeschnitten (Rundung hin zu Null).

123
-123
printf("%lli\n", (signed long long) 123.456);
printf("%lli\n", (signed long long)-123.456);

Hat die umzuwandelnde Fliesskommazahl keinen Platz in einem long long, so ist das Resultat undefiniert. Auf heutigen Systemen wird häufig der maximal, beziehungsweise der minimal mögliche Wert angenommen.

9223372036854775807
-9223372036854775808
18446744073709551615
0
printf("%lli\n", (signed   long long) 1e20);
printf("%lli\n", (signed   long long)-1e20);
printf("%llu\n", (unsigned long long) 1e20);
printf("%llu\n", (unsigned long long)-1e20);

Das Resultat kann je nach System unterschiedlich ausfallen. Die hier angegebenen Werte entsprechen den Werten auf dem System des Autors.

Bei der Umwandlung eines Integer-Typs in einen long long bleiben in den wichtigsten Fällen der Wert sowie das Vorzeichen exakt erhalten:



123
-123
unsigned  int      i1 =  123;
signed    int      i2 = -123;
printf("%u\n", (unsigned long long) i1);
printf("%d\n", (signed   long long) i2);

Die Umwandlung eines Integer-Wertes in einen long long, welcher nicht im Werteumfang enthalten ist, ist nicht definiert. Auf heutigen Systemen passiert jedoch normalerweise folgendes: Wenn der zuzuweisende Wert gleichviele oder mehr Bits besitzt, dann werden all diejenigen niederwertigsten Bits des zuzuweisenden Wertes bitgenau kopiert, welche im long long-Typ Platz finden. Falls der zuzuweisende Wert weniger Bitstellen aufweist, werden die verfügbaren Bitstellen an die niederwertigsten Bitstellen des long long kopiert. Die nicht-definierten höherwertigen Bit-Stellen werden folgendermassen aufgefüllt: Wenn der Typ des zuzuweisenden Wertes vorzeichenlos ist, wird an alle nicht-definierten Bit-Stellen das Bit 0 kopiert. Wenn der Typ des zuzuweisenden Wertes vorzeichenbehaftet ist, wird das höchstwertige Bit der verfügbaren Bitstellen an sämtliche höherwertige Bit-Stellen kopiert.

Durch diese Regeln können folgende Fälle zu falschen Werten führen: Eine vorzeichenbehaftete Zahl kann nicht korrekt in einen vorzeichenlosen Typ umgewandelt werden. Eine zu grosse vorzeichenlose Zahl kann bei der Umwandlung in einen vorzeichenbehafteten Typ zu negativen Werten führen.

18446744073709551493
-8446744073709551616
printf("%llu\n", (unsigned long long) -123LL);
printf("%lli\n", (signed   long long)  10000000000000000000LL);

Ein Javascript-Programm zur Veranschaulichung der Effekte beim Abschneiden von Bits ist beim Zahlensystem-Umrechner zu finden.