Ganzzahl (Informatik) - Integer (computer science)

In der Informatik ist eine Ganzzahl ein Datum des ganzzahligen Datentyps , ein Datentyp , der einen Bereich mathematischer Ganzzahlen repräsentiert . Integrale Datentypen können unterschiedlich groß sein und dürfen negative Werte enthalten oder nicht. Ganzzahlen werden in einem Computer üblicherweise als eine Gruppe von Binärziffern (Bits) dargestellt. Die Größe der Gruppierung variiert, sodass die verfügbaren Ganzzahlgrößen je nach Computertyp variieren. Computer - Hardware stellt fast immer einen Weg , um einen Prozessor zu repräsentieren Register oder Speicheradresse als Integer.

Wert und Repräsentation

Der Wert eines Elements mit einem ganzzahligen Typ ist die mathematische ganze Zahl, der es entspricht. Integral - Typen können unsigned (fähig repräsentiert nur nicht-negative ganze Zahlen sind ) , oder signiert ( die Lage des für negative ganze Zahlen als auch).

Ein ganzzahliger Wert wird typischerweise im Quellcode eines Programms als eine Folge von Ziffern angegeben, die optional mit + oder − vorangestellt werden. Einige Programmiersprachen erlauben andere Notationen, wie beispielsweise hexadezimal (Basis 16) oder oktal (Basis 8). Einige Programmiersprachen erlauben auch Zifferngruppentrenner .

Die interne Darstellung dieses Datums ist die Art und Weise, wie der Wert im Speicher des Computers gespeichert wird. Im Gegensatz zu mathematischen ganzen Zahlen hat ein typisches Datum in einem Computer einen minimalen und maximalen möglichen Wert.

Die gebräuchlichste Darstellung einer positiven ganzen Zahl ist eine Folge von Bits , die unter Verwendung von binären Zahlensystem . Die Reihenfolge des Speicherbytes , die Bits Unterschiedlich zu speichern; siehe Endianität . Die Breite oder Genauigkeit eines ganzzahligen Typs ist die Anzahl der Bits in seiner Darstellung. Ein ganzzahliger Typ mit n Bits kann 2 n Zahlen codieren ; zum Beispiel repräsentiert ein Typ ohne Vorzeichen typischerweise die nicht-negativen Werte 0 bis 2 n –1. Manchmal werden andere Codierungen von ganzzahligen Werten in Bitmustern verwendet, beispielsweise binärcodierter Dezimal- oder Gray-Code oder als gedruckte Zeichencodes wie ASCII .

Es gibt vier wohlbekannte Möglichkeiten, Zahlen mit Vorzeichen in einem binären Computersystem darzustellen. Am gebräuchlichsten ist das Zweierkomplement , das es einem vorzeichenbehafteten Ganzzahltyp mit n Bits ermöglicht, Zahlen von -2 ( n -1) bis 2 ( n -1) -1 darzustellen . Die Zweierkomplementarithmetik ist praktisch, weil es eine perfekte Eins-zu-Eins-Entsprechung zwischen Darstellungen und Werten gibt (insbesondere keine getrennten +0 und −0) und weil Addition , Subtraktion und Multiplikation nicht zwischen vorzeichenbehafteten und vorzeichenlosen Typen unterscheiden müssen . Andere Möglichkeiten sind Offset-Binär , Vorzeichen-Größe und Einerkomplement .

Einige Computersprachen definieren ganzzahlige Größen maschinenunabhängig; andere haben unterschiedliche Definitionen in Abhängigkeit von der zugrunde liegenden Prozessorwortgröße. Nicht alle Sprachimplementierungen definieren Variablen aller ganzzahligen Größen, und definierte Größen können in einer bestimmten Implementierung nicht einmal unterschiedlich sein. Eine ganze Zahl in einer Programmiersprache kann in einer anderen Sprache oder auf einem anderen Prozessor eine andere Größe haben.

Gängige ganzzahlige Datentypen

Bits Name Bereich (unter der Annahme, dass das Zweierkomplement für vorzeichenbehaftet ist ) Dezimalziffern Verwendet Implementierungen
C / C++ C# Pascal und Delphi Java SQL FORTRAN D
4
knabbern , Semioktett Vorzeichen: Von −8 bis 7, von −(2 3 ) bis 2 3  − 1
0,9
Binärcodierte dezimale , einstellige Dezimalstellendarstellung n / A n / A n / A n / A n / A n / A n / A
Ohne Vorzeichen: Von 0 bis 15, was 2 4  − 1 . entspricht
1,2
8
Byte , Oktett , i8, u8 Vorzeichen: Von −128 bis 127, von −(2 7 ) bis 2 7  − 1
2.11
ASCII - Zeichen, Codeeinheiten in der UTF-8 - Zeichencodierung int8_t , signiertes Zeichen sbyte Kurzinfo Byte Tinyint ganze Zahl(1) Byte
Ohne Vorzeichen: Von 0 bis 255, was 2 8  − 1 . entspricht
2,41
uint8_t , unsigniertes Zeichen Byte Byte n / A unsigned tinyint n / A ubyte
16
halbwort, wort , kurz, i16, u16 Gezeichnet: Von −32.768 bis 32.767, von −(2 15 ) bis 2 15  − 1
4,52
UCS-2 Zeichen, Codeeinheiten in der UTF-16 - Zeichencodierung int16_t , kurz , int kurz Smallint kurz klein ganze Zahl(2) kurz
Ohne Vorzeichen: Von 0 bis 65.535, was 2 16  − 1 . entspricht
4.82
uint16_t, unsigned , unsigned int ukurz Wort verkohlen unsigned smallint n / A ukurz
32
Wort, langes , Doppelwort, langes Wort, int, i32, u32 Gezeichnet: Von −2.147.483.648 bis 2.147.483.647 , von −(2 31 ) bis 2 31  − 1
9,33
UTF-32- Zeichen, True Color mit Alpha, FourCC , Zeiger in 32-Bit-Computing int32_t , int , lang int LongInt ; Ganze Zahl int int ganze Zahl(4) int
Ohne Vorzeichen: Von 0 bis 4.294.967.295, was 2 32  − 1 . entspricht
9,63
uint32_t, unsigned , unsigned int , unsigned long uint Langwort ; DWord ; Kardinal n / A unsigned int n / A uint
64
Wort, Doppelwort, Langwort, lang, lang, Quad, Quadwort, Qword, int64, i64, u64 Unterzeichnet: Von −9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 , von −(2 63 ) bis 2 63  − 1
18.96
Zeit (Millisekunden seit der Unix-Epoche ), Zeiger im 64-Bit-Computing int64_t , lang , lang lang lang Int64 lang bigint ganze Zahl(8) lang
Ohne Vorzeichen : Von 0 bis 18.446.744.073.709.551.615, was 2 64  − 1 . entspricht
19.27
uint64_t , unsigned long long ulong UInt64 ; QWord n / A unsigned bigint n / A ulong
128
Oktawort, Doppel-Quadwort, i128, u128 Unterzeichnet: Von −170.141.183.460.469.231.731.687.303.715.884.105.728 bis 170.141.183.460.469.231.731.687.303.715.884.105.727, von −(2 127 ) bis 2 127  − 1
38,23
Komplexe wissenschaftliche Berechnungen,

IPv6- Adressen, GUIDs

C: nur als nicht standardmäßige Compiler-spezifische Erweiterung verfügbar n / A n / A n / A n / A Ganzzahl(16) Cent
Ohne Vorzeichen : Von 0 bis 340.282.366.920.938.463.463.374.607.431.768.211.455, was 2 128  − 1 . entspricht
38,53
n / A ucent
n
n- Bit-Ganzzahl
(allgemeiner Fall)
Vorzeichen: −(2 n −1 ) bis (2 n −1  − 1) ( n  − 1) log 10  2 Ada : Bereich -2**(n-1)..2**(n-1)-1
Ohne Vorzeichen: 0 bis (2 n − 1) n log 10  2 Ada: Bereich 0..2**n-1 , mod 2**n ; BigDecimal- oder Decimal-Klassen von Standardbibliotheken oder beliebigen arithmetischen Bibliotheken von Drittanbietern in vielen Sprachen wie Python, C++ usw.

Verschiedene CPUs unterstützen verschiedene integrale Datentypen. Normalerweise unterstützt die Hardware sowohl vorzeichenbehaftete als auch vorzeichenlose Typen, jedoch nur einen kleinen, festen Satz von Breiten.

Die obige Tabelle listet integrale Typenbreiten auf, die in Hardware von gängigen Prozessoren unterstützt werden. Hohe Programmiersprachen bieten mehr Möglichkeiten. Es ist üblich, einen Integraltyp mit doppelter Breite zu verwenden, der doppelt so viele Bits hat wie der größte hardwareunterstützte Typ. Viele Sprachen haben auch Bitfeldtypen (eine bestimmte Anzahl von Bits, die normalerweise auf weniger als die maximale von der Hardware unterstützte Breite beschränkt ist) und Bereichstypen (die nur die Ganzzahlen in einem bestimmten Bereich darstellen können).

Einige Sprachen wie Lisp , Smalltalk , REXX , Haskell , Python und Raku unterstützen Ganzzahlen mit beliebiger Genauigkeit (auch als Integer mit unendlicher Genauigkeit oder Bignums bekannt ). Andere Sprachen, die dieses Konzept nicht als Konstrukt der obersten Ebene unterstützen, haben möglicherweise Bibliotheken zur Verfügung, um sehr große Zahlen mit Arrays kleinerer Variablen darzustellen, wie zum Beispiel Javas BigInteger- Klasse oder Perlsbigint “-Paket. Diese verwenden so viel Speicher des Computers, wie zum Speichern der Zahlen erforderlich ist; Ein Computer hat jedoch nur eine endliche Menge an Speicherplatz, sodass auch sie nur eine endliche Teilmenge der mathematischen ganzen Zahlen darstellen können. Diese Schemata unterstützen sehr große Zahlen, zum Beispiel könnte ein Kilobyte Speicher verwendet werden, um Zahlen mit einer Länge von bis zu 2466 Dezimalstellen zu speichern.

Ein Boolean- oder Flag- Typ ist ein Typ, der nur zwei Werte darstellen kann: 0 und 1, normalerweise identifiziert mit false bzw. true . Dieser Typ kann unter Verwendung eines einzelnen Bits im Speicher gespeichert werden, erhält jedoch häufig ein volles Byte, um die Adressierung und die Zugriffsgeschwindigkeit zu erleichtern.

Eine Vier-Bit-Menge wird als Nibble (beim Essen kleiner als ein Bissen ) oder Nibble (als Wortspiel mit der Form des Wortes Byte ) bezeichnet. Ein Halbbyte entspricht einer Ziffer in hexadezimaler Form und enthält eine Ziffer oder einen Vorzeichencode in binär kodierter Dezimalzahl.

Bytes und Oktette

Der Begriff Byte bedeutete ursprünglich „die kleinste adressierbare Speichereinheit“. In der Vergangenheit wurden alle 5-, 6-, 7-, 8- und 9-Bit-Bytes verwendet. Es gab auch Computer, die einzelne Bits adressieren konnten („bit-adressierte Maschine“) oder die nur 16- oder 32-Bit-Mengen adressieren konnten („word-adressierte Maschine“). Der Begriff Byte wurde im Zusammenhang mit bit- und wortadressierten Maschinen meist überhaupt nicht verwendet.

Der Begriff Oktett bezieht sich immer auf eine 8-Bit-Menge. Es wird hauptsächlich im Bereich der Computernetzwerke verwendet , wo Computer mit unterschiedlichen Bytebreiten möglicherweise kommunizieren müssen.

In der modernen Verwendung bedeutet Byte fast ausnahmslos acht Bits, da alle anderen Größen nicht mehr verwendet werden; daher ist Byte gleichbedeutend mit Oktett .

Wörter

Der Begriff "Wort" wird für eine kleine Gruppe von Bits verwendet, die gleichzeitig von Prozessoren einer bestimmten Architektur verarbeitet werden . Die Größe eines Wortes ist somit CPU-spezifisch. Viele verschiedene Wortgrößen wurden verwendet, einschließlich 6-, 8-, 12-, 16-, 18-, 24-, 32-, 36-, 39-, 40-, 48-, 60- und 64-Bit. Da es sich um eine Architektur handelt, wird die Größe eines Wortes normalerweise von der ersten CPU in einer Familie festgelegt und nicht von den Eigenschaften einer späteren kompatiblen CPU. Die Bedeutungen der Begriffe von abgeleiteten Wort wie Langwort- , Doppelwort , Quadwort und Halbwort- , variieren auch mit dem CPU und OS.

Praktisch alle neuen Desktop-Prozessoren können 64-Bit-Wörter verwenden, obwohl eingebettete Prozessoren mit 8- und 16-Bit-Wortgröße immer noch üblich sind. Die Wortlänge von 36 Bit war in den frühen Tagen der Computer üblich.

Eine wichtige Ursache für die Nichtportabilität von Software ist die falsche Annahme, dass alle Computer dieselbe Wortgröße haben wie der Computer, der vom Programmierer verwendet wird. Wenn beispielsweise ein Programmierer, der die Sprache C verwendet, fälschlicherweise eine Variable als int deklariert , die zum Speichern von Werten größer als 2 15 −1 verwendet wird, schlägt das Programm auf Computern mit 16-Bit-Ganzzahlen fehl. Diese Variable hätte als long deklariert werden müssen , die auf jedem Computer mindestens 32 Bit hat. Programmierer können auch fälschlicherweise annehmen, dass ein Zeiger ohne Informationsverlust in eine Ganzzahl umgewandelt werden kann, was auf (einigen) 32-Bit-Computern funktionieren kann, aber auf 64-Bit-Computern mit 64-Bit-Zeigern und 32-Bit-Ganzzahlen fehlschlägt. Dieses Problem wird von C99 in stdint.h in Form von gelöst intptr_t.

Kurze ganze Zahl

Eine kurze Ganzzahl kann eine ganze Zahl darstellen, die im Vergleich zu einer Standard-Ganzzahl auf demselben Computer weniger Speicherplatz benötigt, aber einen kleineren Bereich hat.

In C wird es mit short bezeichnet . Er muss mindestens 16 Bit lang sein und ist oft kleiner als eine Standard-Ganzzahl, dies ist jedoch nicht erforderlich. Ein konformes Programm kann davon ausgehen, dass es Werte zwischen −(2 15 −1) und 2 15 −1 sicher speichern kann , darf jedoch nicht annehmen, dass der Bereich nicht größer ist. In Java , eine kurze ist immer ein 16-Bit - Integer. In der Windows-API ist der Datentyp SHORT auf allen Maschinen als 16-Bit-Ganzzahl mit Vorzeichen definiert.

Gemeinsame kurze Integer-Größen
Programmiersprache Name des Datentyps Unterzeichnung Größe in Byte Mindestwert Höchster Wert
C und C++ kurz unterzeichnet 2 -32.767 +32.767
unsigned short ohne Vorzeichen 2 0 65.535
C# kurz unterzeichnet 2 −32.768 +32.767
ukurz ohne Vorzeichen 2 0 65.535
Java kurz unterzeichnet 2 −32.768 +32.767

Lange ganze Zahl

Eine lange Ganzzahl kann eine ganze Ganzzahl darstellen, deren Bereich größer oder gleich dem einer Standard-Ganzzahl auf demselben Computer ist.

In C wird es mit long bezeichnet . Sie muss mindestens 32 Bit umfassen und kann größer als eine Standard-Ganzzahl sein oder nicht. Ein konformes Programm kann davon ausgehen, dass es Werte zwischen -(2 31 -1) und 2 31 -1 sicher speichern kann , darf jedoch nicht annehmen, dass der Bereich nicht größer ist.

Gemeinsame lange Integer-Größen
Programmiersprache Zulassungstyp Plattformen Name des Datentyps Speicherung in Byte Signiertes Sortiment Unsignierter Bereich
C ISO/ANSI C99 Internationaler Standard Unix , 16/32-Bit-Systeme
Windows , 16/32/64-Bit-Systeme
lang 4
(Mindestanforderung 4)
−2.147.483.647 bis +2.147.483.647 0 bis 4.294.967.295
(Mindestanforderung)
C ISO/ANSI C99 Internationaler Standard Unix ,
64-Bit-Systeme
lang 8
(Mindestanforderung 4)
−9.223.372.036.854.775.807 bis +9.223.372.036.854.775.807 0 bis 18.446.744.073.709.551.615
C++ ISO/ANSI Internationaler Standard Unix , Windows ,
16/32-Bit-System
lang 4
(Mindestanforderung 4)
−2.147.483.648 bis +2.147.483.647
0 bis 4.294.967.295
(Mindestanforderung)
C++/CLI Internationaler Standard
ECMA-372
Unix , Windows ,
16/32-Bit-Systeme
lang 4
(Mindestanforderung 4)
−2.147.483.648 bis +2.147.483.647
0 bis 4.294.967.295
(Mindestanforderung)
VB Firmenstandard Fenster Lang 4 −2.147.483.648 bis +2.147.483.647 N / A
VBA Firmenstandard Windows , Mac OS X Lang 4 −2.147.483.648 bis +2.147.483.647 N / A
SQL Server Firmenstandard Fenster BigInt 8 −9.223.372.036.854.775.808 bis +9.223.372.036.854.775.807 0 bis 18.446.744.073.709.551.615
C# / VB.NET Internationaler ECMA-Standard Microsoft .NET lang oder Int64 8 −9.223.372.036.854.775.808 bis +9.223.372.036.854.775.807 0 bis 18.446.744.073.709.551.615
Java Internationaler/Unternehmensstandard Java-Plattform lang 8 −9.223.372.036.854.775.808 bis +9.223.372.036.854.775.807 N / A
Pascal ? Windows , UNIX int64 8 −9.223.372.036.854.775.808 bis +9.223.372.036.854.775.807 0 bis 18.446.744.073.709.551.615 (Qword-Typ)

Lang Lang

In der C99- Version der Programmiersprache C und der C++11- Version von C++ wird ein long longTyp unterstützt, der die doppelte Mindestkapazität des Standards hat long. Dieser Typ wird von Compilern nicht unterstützt, die erfordern, dass C-Code mit dem vorherigen C++-Standard C++03 kompatibel ist, da der lange lange Typ in C++03 nicht existierte. Für einen ANSI/ISO-konformen Compiler müssen die Mindestanforderungen für die angegebenen Bereiche, d. h. −(2 63 −1) bis 2 63 −1 für Vorzeichen und 0 bis 2 64 −1 für unsigniert erfüllt sein; eine Erweiterung dieses Bereichs ist jedoch zulässig. Dies kann beim Austausch von Code und Daten zwischen Plattformen oder beim direkten Hardwarezugriff ein Problem sein. Somit gibt es mehrere Sätze von Kopfteilen, die plattformunabhängige Typen mit exakter Breite bereitstellen. Die C- Standardbibliothek bietet stdint.h ; dies wurde in C99 und C++11 eingeführt.

Siehe auch

Anmerkungen

Verweise