Integer (Datentyp)
Mit Integer ([], englisch [], 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“[1] beschreibt die grundlegenden Eigenschaften und Rechenoperationen für ganze Zahlen und Gleitkommazahlen, unabhängig von der eingesetzten Programmiersprache und dem eingesetzten Computer.
Darstellungen[Bearbeiten | Quelltext bearbeiten]
Vorzeichenlose Zahlen[Bearbeiten | Quelltext bearbeiten]
| Zahl | Darstellung | Bias | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summe |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |||
| 0 | 00000000 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 00000111 |
0 | 0 | 0 | 0 | 0 | 0 | 4·1 | 2·1 | 1·1 | 7 |
| 100 | 01100100 |
0 | 0 | 64·1 | 32·1 | 0 | 0 | 4·1 | 0 | 0 | 100 |
| 255 | 11111111 |
0 | 128·1 | 64·1 | 32·1 | 16·1 | 8·1 | 4·1 | 2·1 | 1·1 | 255 |
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.
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.
Vorzeichenbehaftete Zahlen im Zweierkomplement[Bearbeiten | Quelltext bearbeiten]
| Zahl | Darstellung | Bias | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summe |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | −128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ← Wert | ||
| −128 | 10000000 |
0 | −128·1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | −128 |
| −100 | 10011100 |
0 | −128·1 | 0 | 0 | 16·1 | 8·1 | 4·1 | 0 | 0 | −100 |
| −7 | 11111001 |
0 | −128·1 | 64·1 | 32·1 | 16·1 | 8·1 | 0 | 0 | 1·1 | −7 |
| 0 | 00000000 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 00000111 |
0 | 0 | 0 | 0 | 0 | 0 | 4·1 | 2·1 | 1·1 | 7 |
| 100 | 01100100 |
0 | 0 | 64·1 | 32·1 | 0 | 0 | 4·1 | 0 | 0 | 100 |
| 127 | 01111111 |
0 | 0 | 64·1 | 32·1 | 16·1 | 8·1 | 4·1 | 2·1 | 1·1 | 127 |
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.
Vorzeichenbehaftete Zahlen im Einerkomplement[Bearbeiten | Quelltext bearbeiten]
| Zahl | Darstellung | Bias | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summe |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | −127 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ← Wert | ||
| −127 | 10000000 |
0 | −127·1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | −127 |
| −100 | 10011011 |
0 | −127·1 | 0 | 0 | 16·1 | 8·1 | 0 | 2·1 | 1·1 | −100 |
| −7 | 11111000 |
0 | −127·1 | 64·1 | 32·1 | 16·1 | 8·1 | 0 | 0 | 0 | −7 |
| −0 | 11111111 |
0 | −127·1 | 64·1 | 32·1 | 16·1 | 8·1 | 4·1 | 2·1 | 1·1 | 0 |
| 0 | 00000000 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 00000111 |
0 | 0 | 0 | 0 | 0 | 0 | 4·1 | 2·1 | 1·1 | 7 |
| 100 | 01100100 |
0 | 0 | 64·1 | 32·1 | 0 | 0 | 4·1 | 0 | 0 | 100 |
| 127 | 01111111 |
0 | 0 | 64·1 | 32·1 | 16·1 | 8·1 | 4·1 | 2·1 | 1·1 | 127 |
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.
Vorzeichenbehaftete Zahlen als Vorzeichen und Betrag[Bearbeiten | Quelltext bearbeiten]
| Zahl | Darstellung | Bias | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Faktor·Summe |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Vorzeichen | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ← Wert | ||
| −127 | 11111111 |
0 | 1 ≙ Faktor −1 | 64·1 | 32·1 | 16·1 | 8·1 | 4·1 | 2·1 | 1·1 | −1·127 = −127 |
| −100 | 11100100 |
0 | 1 ≙ Faktor −1 | 64·1 | 32·1 | 0 | 0 | 4·1 | 0 | 0 | −1·100 = −100 |
| −7 | 10000111 |
0 | 1 ≙ Faktor −1 | 0 | 0 | 0 | 0 | 4·1 | 2·1 | 1·1 | −1·7 = −7 |
| −0 | 10000000 |
0 | 1 ≙ Faktor −1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | −1·0 = 0 |
| 0 | 00000000 |
0 | 0 ≙ Faktor +1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +1·0 = 0 |
| 7 | 00000111 |
0 | 0 ≙ Faktor +1 | 0 | 0 | 0 | 0 | 4·1 | 2·1 | 1·1 | +1·7 = 7 |
| 100 | 01100100 |
0 | 0 ≙ Faktor +1 | 64·1 | 32·1 | 0 | 0 | 4·1 | 0 | 0 | +1·100 = 100 |
| 127 | 01111111 |
0 | 0 ≙ Faktor +1 | 64·1 | 32·1 | 16·1 | 8·1 | 4·1 | 2·1 | 1·1 | +1·127 = 127 |
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.
Vorzeichenbehaftete Zahlen als vorzeichenlose Zahlen mit Bias[Bearbeiten | Quelltext bearbeiten]
| Zahl | Darstellung | Bias | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Summe |
|---|---|---|---|---|---|---|---|---|---|---|---|
| −128 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ← Wert | ||
| −128 | 00000000 |
−128 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | −128 |
| −100 | 00011100 |
−128 | 0 | 0 | 0 | 16·1 | 8·1 | 4·1 | 0 | 0 | −100 |
| −7 | 01111001 |
−128 | 0 | 64·1 | 32·1 | 16·1 | 8·1 | 0 | 0 | 1·1 | −7 |
| 0 | 10000000 |
−128 | 128·1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 10000111 |
−128 | 128·1 | 0 | 0 | 0 | 0 | 4·1 | 2·1 | 1·1 | 7 |
| 100 | 11100100 |
−128 | 128·1 | 64·1 | 32·1 | 0 | 0 | 4·1 | 0 | 0 | 100 |
| 127 | 11111111 |
−128 | 128·1 | 64·1 | 32·1 | 16·1 | 8·1 | 4·1 | 2·1 | 1·1 | 127 |
Die Darstellung ist u.a. üblich bei vielen AD- und DA-Wandlern. Außerdem wird sie in der Darstellung des Exponenten in IEEE-Gleitkommadarstellungen benutzt. Eine hervorzuhebende Eigenschaft ist, dass die Ordnungsrelation der kodierten Werte erhalten bleibt, welche auch der Grund für die Verwndung in IEEE-Gleitkommadarstellungen darstellt.
BCD-Darstellungen[Bearbeiten | Quelltext bearbeiten]
Etliche CPUs der 1970er/80er Jahre sowie (auch heute noch) die meisten Taschenrechner arbeiten intern im BCD-Format. Die betroffenen CPUs der 1970er/80er Jahre (z. B. der CPU Sharp SC61860) unterstützten nativ Addition und Subtraktion von BCD-Langzahlen und Verschieben um 4 bit sowie um N×8 bit von BCD-Langzahlen. Damit war eine (für die damalige Zeit) effiziente Arithmetik programmierbar.
Exotische Darstellungen[Bearbeiten | Quelltext bearbeiten]
Weitere exotische Darstellungen sind in [2] beschrieben.
Häufige Speicherformen[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
Um zwei Ganzzahlen A und B zu dividieren, werden sie wie bei der schriftlichen Division verarbeitet.
Arithmetischer Überlauf[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
- 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[Bearbeiten | Quelltext bearbeiten]
- ↑ 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