Mit Integer ([ˈɪnteɡɐ], englisch [ˈɪntɪdʒə], für ganze Zahl; von lateinisch numerus integer) wird in der Informatik ein Datentyp bezeichnet, der ganzzahlige Werte speichert. Als grundlegender arithmetischer Datentyp sind Integer in der Hardware fast aller Rechenanlagen vorhanden und in nahezu jeder Programmiersprache verfügbar. Meist werden mehrere Integerarten bereitgestellt, die sich in der Darstellung, der Länge oder dem Vorhandensein eines Vorzeichens unterscheiden. Der 2001 veröffentlichte Internationale Standard ISO/IEC 10967 „Language Independent Arithmetic“ beschreibt die grundlegenden Eigenschaften und Rechenoperationen für ganze Zahlen und Gleitkommazahlen, unabhängig von der eingesetzten Programmiersprache oder dem eingesetzten Computer.
Darstellungen
Die in Prozessoren direkt unterstützten Ganzzahl-Datentypen haben eine feste Stellenanzahl (zum Beispiel 8 Bit, 32 Bit, 128 Bit), da hierdurch die elektronischen Schaltungen in den Prozessoren fest verdrahtet werden können.
Vorzeichenlose Zahlen
Ganzzahlen werden in einem binären Stellenwertsystem gespeichert und verarbeitet, das bedeutet, dass jede Zahl aus einer festen Anzahl Stellen besteht, und jede dieser Stellen entspricht einem bestimmten Wert. Der Wert einer Zahl ergibt sich in einem Stellensystem dadurch, dass man jede Ziffer der Zahl mit dem jeweiligen Stellenwert multipliziert und diese Teilergebnisse aufsummiert. Im Binärsystem gibt es nur die Ziffern 0 und 1, daher reicht es, die Stellenwerte der Stellen zu addieren, an denen die Ziffer 1 ist.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Stellenwert | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Zahl 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Zahl 7 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
Zahl 100 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
Zahl 255 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Zum Beispiel sind bei der Zahl 100 die Bits 6, 5 und 2 gesetzt. Die dazugehörigen Stellenwerte sind 64, 32 und 4, und deren Summe ist 100.
Die Stellenwerte der einzelnen Bits entsprechen genau den Zweierpotenzen. Durch diese Wahl gibt es zu jeder Zahl genau eine Darstellungsmöglichkeit, und dadurch wiederum wird der Speicherplatz optimal genutzt.
Zweierkomplement
Um auch negative ganze Zahlen darzustellen, wird das Zweierkomplement verwendet. Dabei wird das Vorzeichen der höchstwertigen Stelle umgekehrt.
Zum Beispiel hat bei einer 8-Bit-Zahl die höchstwertige Stelle nicht mehr den Stellenwert 128, sondern −128. Dadurch geht der Zahlenbereich nicht mehr von 0 bis 255, sondern von −128 bis 127.
Beim Rechnen im Zweierkomplement funktionieren Addition und Subtraktion genauso wie bei vorzeichenlosen Zahlen. Das Vergleichen von Zahlen, sowie die Multiplikation und Division müssen jedoch angepasst werden. Die kleinste negative Zahl hat kein entsprechendes Gegenstück bei den positiven Zahlen, daher kann eine Multiplikation mit −1 dazu führen, dass sich das Vorzeichen nicht ändert.
Einerkomplement
Beim Einerkomplement wird das Vorzeichen der höchstwertigen Stelle umgekehrt und 1 abgezogen. Dadurch gibt es 2 unterschiedliche Darstellungen für die Zahl 0, die +0 und −0 genannt werden.
Zum Beispiel hat bei einer 8-Bit-Zahl die höchstwertige Stelle nicht mehr den Stellenwert 128, sondern −127. Dadurch geht der Zahlenbereich nicht mehr von 0 bis 255, sondern von −127 bis 127.
Elektronische Schaltungen zum Rechnen im Einerkomplement sind aufwendiger, daher ist diese Darstellung nicht weit verbreitet.
Vorzeichen und Betrag
In der Betrags-Vorzeichendarstellung werden das Vorzeichen und der Betrag getrennt gespeichert und verarbeitet.
Die Betrags-Vorzeichendarstellung ist zum Multiplizieren und Dividieren praktisch, da das Vorzeichen separat behandelt werden kann. Vergleiche, Additionen und Subtraktionen sind jedoch im Zweierkomplement einfacher umzusetzen.
Exotische Darstellungen
In Bereichen, in denen Dezimalzahlen ziffernweise verarbeitet werden, können Zahlen ziffernweise im BCD-Format gespeichert werden. Für Rechnungen mit mehreren Ziffern ist dieses Format unpraktisch, da die elektronischen Schaltungen entweder zu kompliziert werden oder vor jeder Rechenoperation die Zahlen zwischen dem BCD-Format und dem Binärformat umgewandelt werden müssen.
Weitere exotische Darstellungen sind in beschrieben.
Häufige Speicherformen
Ein Integer besteht in der Regel aus 8, 16, 32, 64 oder 128 Bits (also 1, 2, 4, 8 oder 16 Bytes) – entsprechend der Wortbreite der jeweiligen CPU. Historisch wurden auch andere Werte (12, 48, … Bit) verwendet.
Namen von Integer-Datentypen mit festgelegter Breite setzen sich zusammen aus einem Vorzeichenindikator und der Breite in Bits. So bezeichnet zum Beispiel Int32
einen vorzeichenbehafteten 32-Bit breiten Datentyp, während UInt128
einen vorzeichenlosen („unsigned“) 128-Bit breiten Datentyp bezeichnet. Je nach Programmiersprache variieren die tatsächlichen Namen.
Zusätzlich gibt es historisch gewachsene Namen für die Datentypen, die keinem festen Schema folgen und je nach Programmiersprache und Prozessor variieren, zum Beispiel:
- Byte oder char für 8 Bit, je nach Programmiersprache mit oder ohne Vorzeichen
- Word für 16, 18, 32, 36 Bit, je nach Rechnerarchitektur, davon abgeleitet DWord für „double word“ und QWord für „quad word“
- Int, Integer, SmallInt, short int, LongInt, long long int, je nach Rechnerarchitektur
- Rune, für die Darstellung von Zeichen, siehe Unicode
Bei der Ablage im Speicher muss festgelegt sein, in welcher Reihenfolge die Bits der Zahlendarstellung auf die einzelnen Bytes verteilt werden, siehe Bytereihenfolge.
Größe (Bit) |
Vorzeichen | Grenzen des Wertebereichs (Zweierkomplement) | Dezimalstellen (ohne Vorzeichen) | |
---|---|---|---|---|
min | max | |||
8 | signed | −128 | 127 | 3 |
unsigned | 0 | 255 | 3 | |
16 | signed | −32.768 | 32.767 | 5 |
unsigned | 0 | 65.535 | 5 | |
32 | signed | −2.147.483.648 | 2.147.483.647 | 10 |
unsigned | 0 | 4.294.967.295 | 10 | |
64 | signed | −9.223.372.036.854.775.808 | 9.223.372.036.854.775.807 | 19 |
unsigned | 0 | 18.446.744.073.709.551.615 | 20 | |
128 | signed | ≈ −1,70141·1038 | ≈ 1,70141·1038 | 39 |
unsigned | 0 | ≈ 3,40282·1038 | 39 | |
n | signed | −2n−1 | 2n−1 − 1 | ⌈log10 2n−1⌉ |
unsigned | 0 | 2n − 1 | ⌈log10 2n⌉ |
Rechenoperationen
Die folgenden Rechenoperationen gelten im Zweierkomplement. In den anderen Darstellungen ist die Umsetzung aufwendiger, das heißt mit mehr elektronischen Gattern verbunden, da die 0 zwei unterschiedliche Darstellungen hat.
Vergleich
Um zwei vorzeichenlose Ganzzahlen A und B zu vergleichen, wird von der Zahl A die Zahl B subtrahiert. Zusätzlich wird der Übertrag, der bei der höchstwertigen Stelle entsteht, untersucht.
- Ist der Übertrag 1, ist B größer als A.
- Ist der Übertrag 0, ist B kleiner oder gleich A.
- Ist das Ergebnis der Subtraktion 0, sind die Zahlen gleich.
Um zwei vorzeichenbehaftete Ganzzahlen A und B zu vergleichen, wird deren höchstwertiges Bit gekippt (0 wird zu 1, 1 wird zu 0), die so entstandenen Zahlen werden wie vorzeichenlose Zahlen verglichen.
Addition
Um zwei Ganzzahlen A und B zu addieren, werden ihre Bits paarweise addiert, wie bei der schriftlichen Addition. Der elektronische Baustein, um ein Bit zweier Zahlen und den Übertrag der vorherigen Stelle zu addieren, heißt Volladdierer.
Wenn beim Addieren der höchstwertigen Stelle ein Übertrag entsteht, ist das Ergebnis zu groß für den Datentyp. Bei vorzeichenlosen Zahlen wird ein solcher Überlauf üblicherweise ignoriert. Bei vorzeichenbehafteten Zahlen hängt das Verhalten von der Programmiersprache ab: In C ist das Verhalten undefiniert, in Java wird der Übertrag verworfen.
Subtraktion
Um zwei Ganzzahlen A und B zu subtrahieren, werden alle Bits von B gekippt (aus 0 wird 1, aus 1 wird 0), anschließend wird die Summe aus A, dem gekippten B und 1 berechnet. Statt B zu subtrahieren wird also die „Gegenzahl“ von B addiert.
Wenn bei dieser Addition ein Übertrag entsteht, war die Subtraktion erfolgreich. Wenn jedoch kein Übertrag entsteht, liegt das mathematische Ergebnis außerhalb des darstellbaren Bereichs, mit den gleichen Folgen wie bei der Addition.
Multiplikation
Um zwei Ganzzahlen A und B zu multiplizieren, werden A und B in die einzelnen Bits zerlegt und wie bei der schriftlichen Multiplikation multipliziert. Das Ergebnis ist eine Ganzzahl, die so viele Stellen hat wie A und B zusammen.
Division
Um zwei Ganzzahlen A und B zu dividieren, werden sie wie bei der schriftlichen Division verarbeitet.
Arithmetischer Überlauf
Entsteht beim Rechnen mit Ganzzahlen ein Wert außerhalb ihres Wertebereiches, führt dies zu einem arithmetischen Überlauf. So wird z. B. bei einer vorzeichenlosen 8-Bit-Integer-Variablen aus 255+1 der Wert 0; bei einer vorzeichenbehafteten im Zweierkomplement hingegen aus 127+1 entweder der Wert −128 oder undefiniertes Verhalten, je nach Programmiersprache.
Verwendung
Ganzzahlen lassen sich in Computern vielseitig einsetzen:
- Als Zahlen, mit denen gerechnet wird
- Als Nummern bzw. Kennungen, um Objekte zu unterscheiden (Fehlernummern, Fehlercodes, IDs in Datenbanken)
- Als Bitmenge, für eine Teilmenge einer kleinen Anzahl von Objekten (mögliche Zustände in nichtdeterministischen Automaten)
Verwandte Datentypen
- Aufzählungstypen definieren eine Menge von unterscheidbaren Objekten, sie werden üblicherweise als Ganzzahl gespeichert.
- Festkommazahlen funktionieren analog zu den Ganzzahlen, da das Komma keine Auswirkungen auf Vergleich, Addition und Subtraktion hat, lediglich bei Multiplikation und Division muss das Komma verschoben und das Ergebnis gerundet werden.
- Gleitkommazahlen decken bei gleichem Speicherbedarf einen größeren Zahlenbereich ab, können dafür aber nicht alle ganzen Zahlen in diesem Bereich darstellen. Durch die erforderlichen Rundungen innerhalb der Rechnungen gelten viele der Rechenregeln (Assoziativgesetz, Distributivgesetz) dort nicht.
Einzelnachweise
- ↑ ISO/IEC 10967 in der englischsprachigen Wikipedia
- ↑ Donald E. Knuth: The Art of Computer Programming. 2. Seminumerical Algorithms. 3. Auflage. Addison-Wesley, 1997, ISBN 0-201-89684-2. S. 195, 4.1 Positional number systems; S. 284, 4.3.2 Modular arithmetic