long int
Typ
Die Angabe long
ist eine Modifikation des int
-Typs. Ein long int
speichert einen ganzzahligen Wert, welcher heutzutage normalerweise mit 32 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 int
, oder kurz long
, wird auf den heute gängigen Systemen mit 32 Bits codiert. Diese Grössenangabe ist jedoch nicht garantiert, sondern wird auf dieser Seite nur als Richtlinie angegeben. Der Typ long
bezeichnet eine lange Ganzzahl
im dem Sinne, dass die grösstmögliche Ganzzahl dieses Typs im Vergleich zu einem normalen int
mehr Ziffern besitzt.
In heutigen Systemen ist ein long
dem int
-Typ gleichzusetzen und existiert somit häufig nur noch als Kompatibilitätsgründen zu älterem Code oder als Unterscheidungsmerkmal in Protokoll- oder Dateiformat-Beschreibungen.
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
-Typ kann entweder mit signed
oder unsigned
modifiziert werden. Je nachdem speichert ein 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, spielt keine Rolle. Genauso spielt es keine Rolle, wo der Typbezeichner int
steht und ob er nicht gar weggelassen wird.
Positive Werte werden als binäre Ganzzahl gespeichert. Die negativen Werte eines signed long
werden auf heutigen Computern üblicherweise mittels des Zweierkomplements codiert.
Die maximal und minimal möglichen Werte eines long
sind in der limits
-Bibliothek definiert.
Wird durch eine arithmetische Operation der Wertebereich eines 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 können int
-Werten ein kleines l
oder ein grosses L
als Suffix angehängt werden. Beide Suffixe bedeuten dasselbe, es wird jedoch empfohlen, die Grossbuchstaben-Variante zu verwenden, damit keine Verwechslungsgefahr mit der Ziffer 1
(eins) besteht. Das Suffix teilt dem Compiler mit, dass es sich bei dem Wert um einen long
-Wert handelt. Da jedoch in heutigen Compilern der long
-Typ normalerweise dasselbe ist wie der int
-Typ, wird das Suffix heutzutage grundsätzlich weggelassen.
987654321l
987654321L
987654321
Um einen festen Wert explizit als unsigned
zu kennzeichnen, kann das Suffix u
verwendet werden.
Compiler geben normalerweise Warnungen aus, wenn feste Werte zu gross für einen int
sind und als ein long
-Wert gekennzeichnet werden sollten. Da jedoch heutzutage der Typ int
dem long
gleichzusetzen ist, wird diese Warnung kaum je gesehen.
Um einen long
mit printf
auszugeben oder mit scanf
einzulesen, wird der Modifikator l
(kleines L
) verwendet:
Arithmetische Umwandlung
Bei Zuweisungen, Initialisierungen oder Casts zu einem long
-Typ werden durch den Compiler gegebenfalls arithmetische Umwandlungen durchgeführt. Im folgenden sind die Umwandlungsregeln für den 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
werden die Nachkommastellen schlicht abgeschnitten (Rundung hin zu Null).
Hat die umzuwandelnde Fliesskommazahl keinen Platz in einem long
, so ist das Resultat undefiniert. Auf heutigen Systemen wird häufig der maximal, beziehungsweise der minimal mögliche Wert angenommen.
2147483647
-2147483648
4294967295
0
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
bleiben in den wichtigsten Fällen der Wert sowie das Vorzeichen exakt erhalten:
Die Umwandlung eines Integer-Wertes in einen 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
-Typ Platz finden. Falls der zuzuweisende Wert weniger Bitstellen aufweist, werden die verfügbaren Bitstellen an die niederwertigsten Bitstellen des 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. Bei der Umwandlung von (vorzeichenbehafteten oder vorzeichenlosen) Zahlen höherer Mächtigkeit (insbesondere bei long long
) kann durch die Kürzung auf weniger Bits der Wert verfälscht werden oder gar zu falschem Vorzeichen führen.
4294967173
-294967296
1705032704
-589934592
Ein Javascript-Programm zur Veranschaulichung der Effekte beim Abschneiden von Bits ist beim Zahlensystem-Umrechner zu finden.