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.

Darstellung von vorzeichenlosen Binärzahlen mit Bits
Bit 7 6 5 4 3 2 1 0
Stellenwert1286432168421
Zahl 000000000
Zahl 700000111
Zahl 10001100100
Zahl 25511111111

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

  1. ISO/IEC 10967 in der englischsprachigen Wikipedia
  2. 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
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.