Im letzten Beitrag habe ich erklärt, wie moderne Programmiersprachen grundlegend aufgebaut sind und durch welche Strukturen sie als Aufsatz auf Assembler das Programmieren erleichtern können. Beim Hantieren mit den Variablen im Beitrag sollte aufgefallen sein, dass ich stillschweigend und implizit davon ausgegangen bin, dass jede Variable eine ganze Zahl repräsentiert. Für die Grundlagen reicht das, bei komplexeren Programmen benötigt man jedoch einen etwas differenzierteren Mechanismus – und um den soll es heute gehen.

 

Bisher haben wir bereits betrachtet, wie Computer mit natürlichen, ganzen und reellen Zahlen rechnen können. In der Mathematik stellen diese Zahlenbereiche Mengen dar, also Sammlungen von Elementen, wobei eine Variable einem beliebigen Wert aus so einer Menge entsprechen kann. In der Informatik bezeichnet man eine solche Menge als Datentyp und die Elemente der Menge als Objekte (eine 1 ist also ein Objekt – seltsam, aber wahr). Mathematisch gesehen sind die Mengen der natürlichen, ganzen und reellen Zahlen zwar unendlich groß, aber auf Grund der Darstellung im Computer als Bitkette haben wir in der Informatik wie bereits besprochen einen begrenzten Zahlenraum.

Nun kann man mit Bitketten natürlich noch viel mehr als einfache Zahlen darstellen. Das erste, was jedem auffällt, der zum Beispiel diesen Artikel hier liest, ist, dass Computer augenscheinlich doch mehr als Zahlen speichern können, mindestens nämlich noch Buchstaben. Neben den Zahlen haben wir also einen weiteren Datentyp: Buchstaben oder Schriftzeichen, im englischen als Characters bezeichnet. Die Darstellung ist hier ziemlich einfach: eine Folge von zumeist 8 Bit (1 Byte) wird als ein konkretes Zeichen interpretiert, wobei die Interpretation meist dem sogenannten ASCII-Standard folgt (der eigentlich nur 7 Bit verwendet). So entspricht etwa die Bitkette 010000112 = 6710 dem großen C; mit 7 Bit können 128 Zeichen dargestellt werden, was für das lateinische Alphabet in Groß- und Kleinschreibung, die Zahlen, Operatoren und einige Sonderzeichen wie Zeilenende und ähnliches locker ausreicht (wer sich jetzt fragt, wie damit zum Beispiel das chinesische  Alphabet abgebildet wird, der möge sich über Unicode informieren – vielleicht mache ich aber dazu auch noch irgendwann einmal einen Beitrag).

Nur allein mit Zeichen kommt man natürlich nicht weit: man muss sie auch zu Wörtern und Sätzen, sogenannten Zeichenketten oder englisch Strings, verbinden können. Auch das ist nicht kompliziert, wenn im Speicher einfach mehrere Bytes hintereinander angeordnet werden. Zusätzlich muss dem Computer nun natürlich noch mitgeteilt werden, wie lang die Zeichenkette ist – das geschieht entweder über die Angabe der Länge als natürliche Zahl vor der Bitkette im Speicher oder durch die Verwendung eines besonderen Abschluss-Bytes am Ende der Bitkette.

Nun fehlt eigentlich nur noch ein wichtiger Datentyp, und zwar der elementarste von allen; ich habe ihn bisher bereits in praktisch jedem Artikel verwendet, ohne ihn explizit zu erwähnen: die Wahrheitswerte. Dieser Datentyp umfasst die beiden Werte wahr (engl. true) und false (engl. false) und ist, wie wir bereits gesehen haben, für das Rechnen im Computer elementar; aber auch beim Programmieren wird er benötigt, zum Beispiel als Wert einer Bedingung in einer Schleife oder Verzweigung; in der Informatik werden Werte dieses Datentyps oft als boolesche Werte bezeichnet (nach dem Mathematiker George Boole, einem englischen Mathemiker und dem Erfinder des ersten Logikkalküls).

Hier noch einmal eine Übersicht über alle bisher genannten Datentypen:

Datentyp Bezeichnung in der Informatik
natürliche Zahlen Natural (N)
ganze Zahlen Integer (Z)
Gleitkommazahlen Real (R)
Zeichen Character (Char)
Zeichenketten String (S)
Wahrheitswerte Boolean (B)

Nun kann man schon allein mit diesen Datentypen recht viele Dinge machen, da sie die Grundlage für jegliche Operation bilden – man spricht daher auch von primitiven Datentypen. Zur Lösung komplexerer Probleme benötigt man jedoch immer noch ein paar Typen zusätzlich, um sie vernünftig lösen zu können. Und hier kommen die zusammengesetzten Datentypen ins Spiel; wie ihr Name schon sagt, setzen sie sich aus anderen Datentypen (entweder primitive oder selbst zusammengesetzte) zusammen. Zwei dieser Strukturen werden besonders häufig verwendet: das Feld (englisch Array) und der Verbund (häufig als Record oder Structure bezeichnet).

1 / 2 / Auf einer Seite lesen

Kommentare (7)

  1. #1 Dr. Webbaer
    September 28, 2011

    Wie werden Datentypen, allgemeiner: Einstellungen auf Datenebene, sprachlicherseits genau implementiert?

  2. #2 Tim
    September 28, 2011

    hi marcus,

    sollte es in dem beispiel mit dem punkt-operator und dem polygon nicht p.e heißen, wenn du die kantenlänge abfragen willst?

    ansonsten ein schöner artikel. die gesamte reihe “wie rechner rechnen” und auch die jetztige gefallen mir gut. vielen dank dafür!

  3. #3 Marcus Frenkel
    September 28, 2011

    @Tim
    Danke für den Hinweis, habe es korrigiert.

    @Dr. Webbaer
    Was meinen Sie genau damit? Die primitiven Datentypen sind lediglich Bitketten im Speicher, die unterschiedlich interpretiert werden. Und die zusammengesetzten Typen sind auch nur Folgen von Bitketten.

  4. #4 Dr. Webbaer
    September 28, 2011

    Vielleicht haben Sie’s vor ohnehin später zu erläutern, aber die Logik, die Daten sprachlicherseits typisiert und so dem Anwender/Programmierer verfügbar (inklusive “Meldungen”) macht, wurde wohl noch nicht direkt beschrieben.

  5. #5 rolak
    September 30, 2011

    [sprachlicherseitige typisierung]…noch nicht direkt beschrieben

    1. Falls Mitgeliefertes der Programmiersprachen gemeint ist: Erste Grundlagen der Mathematik und doch, es wurde hier im blog schon beschrieben.
    2. Falls problemangepasste Datentypen der Programmiersprachen gemeint sind: Das steht hier im thread.
    3. Falls Umgangssprachen gemeint sind: Das hat mit dem Thema nichts zu tun. Eher damit, doch er beliebt ja auch dort eher OT zu verfassen.
  6. #6 Dr. Webbaer
    Oktober 2, 2011

    @rolak
    Yup!, irgendwo hier hat Dr. Webbaer einige Kenntnislücken, was dasjenige betrifft, das zwischen den Bitmanipulationen, den absoluten Grundlagen und der Programmierung einer Hochsprache liegt. Wie genau bspw. das Überlaufen einer Integers oder die Zuordnung eines Funktionsarguments (Dr. W bleibt übrigens gerne noch beim Parameter für “Innen und außen” – vgl. auch die ursprüngliche Wortbedeutung) falschen Typs i.p. Compilerbau bzw. vom Compiler oder Interpreter bearbeitet wird, interessiert eigentlich auch nicht weiter…

  7. #7 Marcus Frenkel
    Oktober 2, 2011

    Irgendwie steh ich noch immer auf dem Schlauch, was nun genau die Frage ist. Vielleicht noch einmal mit einer Formulierung in Umgangs- und nicht in Prosadeutsch versuchen, dann gibt es vielleicht auch eine Antwort drauf.