Integer (Datentyp)

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. Der Wertebereich ist endlich. Berechnungen mit Integern sind in der Regel exakt. Lediglich ein Überlauf kann durch Überschreiten des zulässigen Wertebereichs auftreten. Als grundlegender arithmetischer Datentyp sind Integer in der Hardware fast aller Rechenanlagen vorhanden und in nahezu jeder Programmiersprache verfügbar. Meist werden sogar mehrere Integerarten bereitgestellt, die sich in der Darstellung, der Länge oder dem Vorhandensein eines Vorzeichens unterscheiden. Die implementierte Arithmetik mit Integern ist bisher nicht genormt und weist oft sprachabhängige (JavaC) oder sogar compilerabhängige (C – Reihenfolge der Auswertung von Ausdrücken) Eigenheiten auf. Ein Normungsversuch liegt mit der „Language Independent Arithmetic“ (ISO/IEC 10967)[1] vor.

Darstellungen

Von exotischen Darstellungen[2] abgesehen, gibt es drei Möglichkeiten zur Speicherung von Integer-Variablen. Das Vorzeichen – soweit vorhanden – kann man in allen Darstellungen an einer bestimmten Ziffer ablesen.

In der Betrags-Vorzeichendarstellung werden das Vorzeichen und der Betrag getrennt gespeichert und verarbeitet.

Bei b-Komplementzahlen (Zweierkomplementzahlen) wird genau die halbe Teilmenge der Zahlen mit großem Betrag als negative Zahlen interpretiert, ohne dass die Arithmetik positiver Zahlen wesentlich geändert wird. Das führt zu einfachen Schaltungen und zu einer einfachen Regel für Vorzeichenänderungen (ziffernweises b-Komplement und anschließende Erhöhung der Zahl). Zwischen der Arithmetik mit Zweierkomplementzahlen und rein positiven Binärzahlen besteht kein Unterschied. Es existiert eine bijektive Abbildung zwischen den Darstellungen und den Werten (kein Wert hat zwei Darstellungen). Man kann b-Komplementzahlen wie technische Zähler (Kilometerzähler im Auto) interpretieren. Nachteil von b-Komplementzahlen ist, dass der kleinste negative Wert kein positives Gegenstück in der Darstellung hat.

Bei (b−1)-Komplementzahlen (Einerkomplementzahlen) vereinfacht man dagegen die Regel für Vorzeichenänderungen (die anschließende Erhöhung fällt weg) und muss dafür in der Arithmetik mehr Fallunterscheidungen und vor allem zwei Darstellungen der Null (±0) berücksichtigen.

In modernen Rechenanlagen ist die Basis b praktisch ausnahmslos b = 2 und die Darstellung im Zweierkomplement hat sich weitgehend durchgesetzt.

Dezimale Äquivalente zum Zweier- und Einerkomplement im Binärsystem wären Zehner- und Neunerkomplementzahlen.

Von manchen Herstellern wird oft unter Berufung auf Kundenwünsche (Banken) noch ein Dezimalformat gepflegt. Hier wird fast ausnahmslos eine Betrags-Vorzeichendarstellung gewählt und der Betrag in der sogenannten BCD-Form (binary coded decimal) gespeichert. Der Wunsch ist begründet, da bei der Umwandelung einer Dezimalzahl in eine Integerzahl oder zurück Rundungsfehler auftreten, die eine exakte kaufmännische Buchhaltung unmöglich macht.

Übersicht

ZweierkomplementEinerkomplementBetrags-VorzeichendarstellungBCD-Zahlen
Basis22210
Eindeutigkeitumkehrbar eindeutig2 Darstellungen für den gleichen Wert (±0)2 Darstellungen für den gleichen Wert (±0)Darstellungen ohne Wert
Wertebereichmaximal, asymmetrischsymmetrischsymmetrischsymmetrisch

Beispiele

(die Beispielzahlen sind für 9 Bit ausgelegt, da so zweistellige BCD-Zahlen möglich sind, Darstellung MSB → LSB):

ZweierkomplementEinerkomplementBetrags-VorzeichendarstellungBCD-Zahlen
Maximum0 1111 1111 (255)0 1111 1111 (255)0 1111 1111 (255)0 1001 1001 (99)
170 0001 00010 0001 00010 0001 00010 0001 0111
50 0000 01010 0000 01010 0000 01010 0000 0101
10 0000 00010 0000 00010 0000 00010 0000 0001
00 0000 00000 0000 00000 0000 00000 0000 0000
−01 1111 11111 0000 00001 0000 0000
−11 1111 11111 1111 11101 0000 00011 0000 0001
−21 1111 11101 1111 11011 0000 00101 0000 0010
−51 1111 10111 1111 10101 0000 01011 0000 0101
−171 1110 11111 1110 11101 0001 00011 0001 0111
Minimum+11 0000 0001 (−255)1 0000 0001 (−254)1 1111 1110 (−254)1 1001 1000 (−98)
Minimum1 0000 0000 (−256)1 0000 0000 (−255)1 1111 1111 (−255)1 1001 1001 (−99)

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. In Programmiersprachen sind die Bezeichnungen dieser Zahlen teilweise genormt: In Java werden sie als byte (8), short (16), int (32) und long (64 Bit) bezeichnet. In C gibt es dieselben Bezeichner für Typen, die jedoch in ihrer Größe architekturabhängig variieren. Dafür unterstützt C vorzeichenlose (unsigned) Integer-Varianten, mit denen viele ältere und auch solche Prozessoren ausschließlich oder vorrangig (unmittelbar) arbeiten, wie sie heute noch in Mikrocontrollern und eingebetteten Systemen Anwendung finden. Erst mit C99 wurden plattformunabhängige Typen spezifiziert, die gemäß ihrer expliziten Wortbreite in Bits eindeutig definiert sind, so z. B. für die ein Byte breiten: int8_t resp. uint8_t.

Rechenanlagen verarbeiten Integer meist schneller als Gleitkommazahlen, da oft weniger Bits zu verarbeiten sind (die kleinste IEEE-754-Gleitkommazahl hat 32 Bit) und die Verarbeitung des Exponenten entfällt, was Rechenzeit und Speicherplatz einspart. Zusätzlich bietet eine reine Festkommaarithmetik (Integer basierend) gegenüber Gleitkommaarithmetik den Vorteil der exakten Verarbeitung (innerhalb fester Dynamikgrenzen), datenabhängige Effekte wie Denormalisierung oder Absorption treten nicht auf.[3] Für interne Software von Geldinstituten wird deswegen häufig reine Integerverarbeitung gefordert, wie es z. B. bei GnuCash realisiert ist.[4]

Bei der Ablage im Speicher taucht neben der Notwendigkeit, die Bits der Zahlendarstellung überhaupt abzulegen, noch das Problem der Bytereihenfolge und Anordnung auf.

Maximaler Wertebereich

Größe
(Bit)
Typische NamenVorzeichenGrenzen des Wertebereichs (Zweierkomplement)Dezimalstellen
(ohne Vorzeichen)
minmax
8char, Byte/byte, modern: int8_t bzw. uint8_tsigned−1281273
unsigned02553
16Word, Short/short, Integer, modern: int16_t bzw. uint16_tsigned−32.76832.7675
unsigned065.5355
32DWord/Double Word, int, long (Windows auf 16/32/64-Bit Systemen;[5] Unix/Linux/C99 auf 16/32-Bit Systemen[5]), modern: int32_t bzw. uint32_tsigned−2.147.483.6482.147.483.64710
unsigned04.294.967.29510
64Int64, QWord/Quadword, long long, Long/long (Unix/Linux/C99 auf 64-Bit Systemen[5][6][7]), modern: int64_t bzw. uint64_tsigned−9.223.372.036.854.775.8089.223.372.036.854.775.80719
unsigned018.446.744.073.709.551.61520
128Int128, Octaword, Double Quadwordsigned≈ −1,70141·1038≈ 1,70141·103839
unsigned0≈ 3,40282·103839
nBigIntegersigned−2n−12n−1 − 1⌈log10 2n−1
unsigned02n − 1⌈log10 2n

Arithmetischer Überlauf

Überlauf bei vorzeichenlosen Integerzahlen (Bitlänge 3)
Überlauf bei Integerzahlen (Bitlänge 3+1)

Wird einer Integer-Variable ein Wert außerhalb ihres Wertebereiches zugewiesen, 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 der Wert −128.

Siehe auch

Literatur

Einzelnachweise und Anmerkungen

  1. ISO/IEC 10967 in der englischsprachigen Wikipedia
  2. Knuth: Band 2. S. 195, 4.1 Positional number systems; S. 284, 4.3.2 Modular arithmetic
  3. David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic. In: ACM Computing Surveys. 23, 1991, S. 5–48. doi:10.1145/103162.103163. Abgerufen am 2. September 2010.
  4. What’s new in GnuCash 1.6?. gnucash.org. Abgerufen am 3. September 2010.
  5. a b c Agner Fog: Calling conventions for different C++ compilers and operating systems: Chapter 3, Data Representation (PDF; 416 kB) 16. Februar 2010. Abgerufen am 30. August 2010.
  6. Eric Giguere: The ANSI Standard: A Summary for the C Programmer. 18. Dezember 1987. Abgerufen am 4. September 2010.
  7. Randy Meyers: The New C: Integers in C99, Part 1. drdobbs.com. 1. Dezember 2000. Abgerufen am 4. September 2010.

Auf dieser Seite verwendete Medien

Zahlenkreis int3.jpg
Autor/Urheber: wieschoo.com, Lizenz: CC BY-SA 3.0
Zahlkreis
Zahlenkreis sint3.jpg
Autor/Urheber:

wieschoo.com

, Lizenz: CC-by-sa 3.0

Stellt Überlauf am Integerzahlenkreis im 2er Komplement dar