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, | 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 Perls „ bigint “-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.
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.
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 long
Typ 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
- Beliebig-genaue Arithmetik
- Binärkodierte Dezimalzahl (BCD)
- C-Datentypen
- Ganzzahlüberlauf
- Zahlendarstellungen mit Vorzeichen