int Typ

Der Typ int speichert einen ganzzahligen Wert, welcher heutzutage normalerweise mit 32 Bit codiert wird. Der Typ int gilt in C und C++ als der Standard-Integer-Typ.

Details

Ein int wird auf den heute gängigen Systemen als eine 4-Byte-Ganzzahl, sprich mit 32 Bits codiert. Diese Grössenangabe ist jedoch nicht garantiert, sondern wird auf dieser Seite nur als Richtlinie angegeben.

Früher wurden zum int-Typ sogenannte Typ-Modifikatoren wie short, long oder long long hinzugeschrieben, um die Anzahl an Bits festzulegen, die für die Ganzzahl genutzt werden sollen. Heutzutage werden diese Modifikatoren 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.

In heutigen Systemen ist ein int dem long-Typ gleichzusetzen. Die Angabe long existiert häufig nur noch als Kompatibilitätsgründen zu älterem Code oder als Unterscheidungsmerkmal in Protokoll- oder Dateiformat-Beschreibungen.

Ein int-Typ kann entweder mit signed oder unsigned modifiziert werden. Je nachdem speichert ein int 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.

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

Eine Besonderheit des int-Typs ist, dass er der Standard-Typ für Deklarationen ohne Typangaben ist. Dies kommt beispielsweise bei der (nicht empfehlenswerten) Benutzung der old style Parameters oder bei der Typ-Promotion zum Zug. Aufgrund der Standard-Annahme ist es jedoch auch möglich, einen int nur durch Angabe von signed oder unsigned zu deklarieren:

signed        f;
unsigned      g;

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

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

Wird durch eine arithmetische Operation der Wertebereich eines int ü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.

Werden im Quellcode Ganzzahlen als feste Werte hingeschrieben, so werden sie vom Compiler automatisch als int betrachtet. Im Gegensatz zu long- und long long-Werten benötigen int-Werte somit kein zusätzliches Suffix.

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 als ein long- oder long long-Wert gekennzeichnet werden sollten.

Im Gegensatz zu allen anderen Ganzzahl-Typen mit Modifikatoren wird kein zusätzlicher Modifikator benötigt, um einen int mit printf auszugeben oder mit scanf einzulesen:


123
int s = 123;
printf("%d\n", s);

Arithmetische Umwandlung

Bei Zuweisungen, Initialisierungen oder Casts zu einem int-Typ werden durch den Compiler gegebenfalls arithmetische Umwandlungen durchgeführt. Im folgenden sind die Umwandlungsregeln für den int-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 int werden die Nachkommastellen schlicht abgeschnitten (Rundung hin zu Null).

123
-123
printf("%d\n", (signed   int) 123.456);
printf("%d\n", (signed   int)-123.456);

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

2147483647
-2147483648
4294967295
0
printf("%d\n", (signed   int) 1e20);
printf("%d\n", (signed   int)-1e20);
printf("%u\n", (unsigned int) 1e20);
printf("%u\n", (unsigned int)-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 int bleiben in den wichtigsten Fällen der Wert sowie das Vorzeichen exakt erhalten:





123
-123
123
-123
unsigned  short      s1 =  123;
signed    short      s2 = -123;
unsigned  long long  L1 =  123;
signed    long long  L2 = -123;
printf("%u\n", (unsigned int) s1);
printf("%d\n", (signed   int) s2);
printf("%u\n", (unsigned int) L1);
printf("%d\n", (signed   int) L2);

Die Umwandlung eines Integer-Wertes in einen int, 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 int-Typ Platz finden. Falls der zuzuweisende Wert weniger Bitstellen aufweist, werden die verfügbaren Bitstellen an die niederwertigsten Bitstellen des int 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 und 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
printf("%u\n", (unsigned int) -123);
printf("%d\n", (signed   int)  4000000000);
printf("%d\n", (signed   int)  6000000000LL);
printf("%d\n", (signed   int)  8000000000LL);

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