Kapitel 2: Grundlagen / 2.5 Einfache Datentypen / 2.5.2 Integer

Der Datentyp Integer wurde konstruiert, um die natürlichen Zahlen (0, 1, 2, 3, ..) und die ganzen Zahlen (.., -3, -2, -1, 0, 1, 2, 3, ..) abbilden zu können.

Swift unterstützt sehr viele verschiedene Integer-Datentypen:

Es unterscheidet hierbei zunächst zwischen Integer-Typen mit Vorzeichen (signed, ganze Zahlen) und ohne Vorzeichen (unsigned, natürliche Zahlen). Danach bestimmt die Anzahl der Bits, die für die Speicherung des Integer verwendet werden, den genauen Typ. Es gibt signed und unsigned Integer nämlich jeweils in einer 8, 16, 32 und 64 Bit Variante. Insgesamt bietet Swift also acht verschiedene Integer Datentypen an.

Zusätzlich gibt es in Swift noch zwei weitere Datentypen, je einen für unsigned und signed, deren Speichergröße der sogenannten native Wortlänge des Systems entspricht, für das sie compiliert wurden – auf einem 32-Bit-System sind das 32 Bit und auf einem 64-Bit-System entsprechend 64 Bit.

Insgesamt kommt Swift so auf zehn Integer-Datentypen:

Swift Integer Typ Minimalwert Maximalwert
UInt8 unsigned, 8 Bit 0 255
UInt16 unsigned, 16 Bit 0 65.535
UInt32 unsigned, 32 Bit 0 4.294.967.295
UInt64 unsigned, 64 Bit 0 18.446.744.073.709.551.615
UInt unsigned, 32 oder 64 Bit 0 unterschiedlich
Int8 signed, 8 Bit −128 127
Int16 signed, 16 Bit −32.768 32.767
Int32 signed, 32 Bit −2.147.483.648 2.147.483.647
Int64 signed, 64 Bit −9.223.372.036.854.775.808 9.223.372.036.854.775.807
Int signed, 32 oder 64 Bit unterschiedlich unterschiedlich

Wollen Sie eine Variable oder Konstante von einem speziellen Integer-Typ erzeugen, müssen Sie diesen Typ annotieren. Tun Sie es nicht – verwenden Sie also Type Inference – wird Ihr Integer in aller Regel vom Typ Int sein.

var ersterInteger: Int8 = 23
var zweiterInteger = 23

Wenn Sie den erlaubten Wertebereich eines Integer-Typs verlassen, dann wirft Swift einen Fehler. Selbstverständlich tut es das – denken Sie vielleicht – selbstverständlich ist das aber ganz und gar nicht. In vielen anderen Sprachen führt das Verlassen des erlaubten Wertebereichs nämlich zu einem arithmetischen Überlauf: Die Zahl wird im Dualsystem (Binärsystem) in den dafür vorgesehenen Speicher geschrieben und alles, was nicht hineinpasst, wird abgeschnitten. Das führt zum Beispiel dazu, dass für ein UInt8 in C folgende Rechung gemacht werden kann: 255 + 2 = 1. Der Wert „läuft über“ und fängt sozusagen „vorne“ wieder an. Bei einem vorzeichenbehafteten Integer kann dieses „vorne“ sogar eine negative Zahl bedeuten: Für Int8 in C gilt: 127 + 3 = -126.
Der arithmetischer Überlauf ist ein Standardverhalten in Programmiersprachen, was sicher dafür gesprochen hat, ihn auch in Swift zu übernehmen. Andererseits – und auch das ist unmittelbar einleuchtend – ist dieses Verhalten wie gemacht für Bugs. Das Überlaufen von Speicher in dieser oder einer anderen Form ist in einer Sprache wie C mit großem Abstand für die meisten schwerwiegenden Fehler verantwortlich.

Mit diesem Wissen erweitern wir den obenstehenden Code um zwei Zeilen:

var ersterInteger: Int8 = 23
var zweiterInteger = 23
zweiterInteger = 1000
ersterInteger = 1000

Die ersten drei Zeilen dieses Beispiels werden unter Xcode anstandslos compiliert: Die Variable zweiterIntgeger wurde von Swift zu Int inferiert und sowohl in einer 32-Bit- wie in einer 64-Bit-Umgebung liegt 1000 deutlich unterhalb des Maximalwertes. Die vierte Zeile führt jedoch zu einer Exception, da der Maximalwert für Int8 bei 127 liegt:

Integer literal overflows when stored into ‚Int8‘

Technisch gesehen sind die Datentypen in Swift Klassen. Und Klassen können Eigenschaften (properties) haben. Was das genau ist, werden wir später noch ausführlich besprechen, an dieser Stelle sei aber gesagt, dass jeder Integer-Datentyp in Swift die Eigenschaften min und max hat. Die Integer-Datentypen „kennen“ also ihre minimalen und maximalen Werte. Über einen Punkt hinter dem Datentyp kann man auf diese beiden Properties zugreifen:

let maximalwertInt32 = Int32.max
let minimalwertInt8 = Int8.min

println("Der Maximalwert für Int32 ist: \(maximalwertInt32).")
println("Der Minimalwert für Int8 ist: \(minimalwertInt8).")

Durch diesen Code wird folgende Ausgabe erzeugt:

Der Maximalwert für Int32 ist: 2147483647.
Der Minimalwert für Int8 ist: -128.

Die Konstanten, die sich hinter der min und max Eigenschaft eines Integer-Typs verbergen, sind ihrerseits von demselben Typ wie der Integer selbst. Im Beispiel ist also maximalwertInt32 vom Typ Int32 und minimalwertInt8 vom Typ Int8.

Müssen Sie jetzt jedesmal, wenn Sie einen Integer verwenden möchten, zuerst den am besten geeigneten aus zehn verfügbaren Integer-Typen auswählen? Nein, das müssen Sie nicht. Wenn es keine sehr klaren Gründe dafür gibt, etwas anderes zu verwenden, verwenden Sie bitte schlicht Int.

Int passt praktisch immer. Auch wenn sie vorhaben, nur positive Zahlen zu speichern, verwenden Sie bitte trotzdem Int. Damit erhöhen Sie deutlich die Kompatibilität der einzelnen Programmteile zueinander und das Mehr an Speicher, das sie dadurch verschwenden, fällt bei heutigen Rechnern nicht ins Gewicht. Denn bitte beachten Sie: Die verschiedenen Integer-Typen sind erst einmal nicht miteinander kompatibel, Int8 und Int sind genauso verschieden voneinander wie Bool und Int.

So führt der folgende Code führt zu einer Fehlermeldung, obwohl rein logisch erst einmal nichts daran auszusetzen wäre:

var ersterInteger: Int8 = 23
var zweiterInteger = 23
zweiterInteger = ersterInteger + 1

Führt zu:

‚Int8‘ is not convertible to ‚Int‘

Int8 kann nicht nach Int konvertiert werden. – Kann es natürlich doch, Sie werden in Kürze auch sehen wie, denn alles was logisch geht, können Sie auch in Swift ausdrücken – aber eben nicht ohne weiteres. Wollen Sie die Typgrenzen überschreiten, dann müssen Sie immer von Hand ran.

Solange Sie also nicht um jedes Byte Speicher ringen müssen, alten C-Code in Ihr Projekt integrieren oder sehr spezielle Varianten von Mathematik betreiben wollen, wenn Sie also einfach nur ganz normal in Swift programmieren, sollte immer Int der Integer-Typ Ihrer Wahl sein.

Kapitel 2.5.2: Integer

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.