Datentypen – Speicherbedarf und Typumwandlung
Du möchtest die Datentypen in C genauer kennenlernen? Im folgenden Beitrag zeigen wir die vier wichtigsten Datentypen, die es in C gibt.
Inhaltsübersicht
Speicherverhalten, Wertebereich und Datentypen C
Um die einzelnen Datentypen besser verstehen zu können, beschäftigen wir uns zunächst mit dem Speicherverhalten der Typen. Jede Variable, die du deklarierst, bekommt vom Compiler einen Speicherbereich zugeordnet. Das tut er, indem er die Adresse der ersten Speicherzelle des Bereiches vorgibt. Die Größe des zugeteilten Speicherbereichs ist abhängig von der Art der Variablen. Genauso verhält es sich auch mit dem Wertebereich. Darunter versteht man die Werte, die in diesem Bereich gespeichert werden dürfen.
Außerdem legt der Typ der Variable auch noch fest, wie die Binärcodierung erfolgt. Das heißt für uns, dass wir – egal welchen Typ wir wählen – nur einen endlichen Wertebereich zur Verfügung haben. Die genauen Werte für diese Abhängigkeiten sind allerdings systemabhängig.
Solltest du auf die Idee kommen, diese Einschränkungen zu ignorieren, kannst du dich außerdem auf Rechen- und/oder Programmfehler freuen.
C int und float C
Gehen wir deshalb doch mal die verschiedenen Typen durch. Der erste ist der int-Typ. Diese Datentypen sind 4 Byte groß und können eine von Zahlen darstellen. Die Bibliothek heißt limits.h und gibt an, welche Zahlen zur Auswahl stehen.
Der zweite Typ heißt float. Er hat dieselbe Größe wie int und es gibt dieselbe Menge an Optionen für die Darstellung von Zahlen. Allerdings sind die Optionen selbst andere. Einige sind sogar nur exklusiv für den Fehlercode verfügbar! Daher wird für diesen Typen die Bibliothek float.h verwendet. Das besondere bei diesem Typ ist allerdings die Möglichkeit, nicht verfügbare Zahlen auf verfügbare runden zu lassen.
double C und char C
Als nächstes haben wir noch den Typ Double im Angebot. Er ist 8 Byte groß und erlaubt die Darstellung ganzer Zahlen. Damit bietet er eine genauere Rundungsoption als float. Dennoch verwendet er die gleiche Bibliothek.
Kommen wir zum letzten Typ: Dieser ist der char Typ. Er ist nur 1 Byte groß und ist damit sehr kompakt. Er kann zwar nur verschiedene Zahlen darstellen, dafür werden diese aber als Zeichen angezeigt. Dabei sind die Optionen 0 bis 127 international und die Optionen 128 bis 255 lokalisiert, um in jedem Land die beste Auswahl zu gewährleisten. Die Bibliothek heißt limits.h.
Umwandlung der Datentypen C
Du hast dich jetzt für einen Datentyp entschieden. Nach einer Weile bist du aber unzufrieden und möchtest gerne die dargestellte Zahl in eine Zahl ändern, die in der Anleitung nicht unterstützt wird. Hier kommt jetzt die automatische Typumwandlung ins Spiel, denn sie übernimmt das ganze Drumherum für dich. Willst du zum Beispiel eine 66.6 vom Typ int darstellen lassen, wird daraus automatisch 66 und damit eine unterstützte Option.
Dir ist vielleicht aufgefallen, dass hier nicht gerundet, sondern nur die ungültige Stelle abgeschnitten wurde. Das ist das Standardverhalten in C und passiert genauso, wenn du einen float oder double Wert mit int darstellen lassen willst. Solltest du runden wollen, musst du die Bibliotheksfunktion dafür nutzen oder selbst eine solche anlegen. Solltest du dich aber für einen double entscheiden und einen int-Wert darauf stehen haben, so werden die entsprechenden Nachkommastellen einfach aufgefüllt. Das mag zwar Dinge, wie z.B. wissenschaftliche Ergebnisse verfälschen, jedoch macht es vieles andere einfacher.
C cast
Genauso funktioniert das Ganze mit allen hier angesprochenen Typen. Du kannst eine solche Umwandlung aber auch bewusst herbeiführen, indem du eine sogenannte Cast-Anweisung verwendest. Das macht man meist bei Typeinschränkungen, also wenn Genauigkeit verloren geht. Eine Cast-Anweisung sieht zum Beispiel so aus:
Und nun kommt die unvermeidliche Ausnahme zu diesen Regeln: In Ausdrücken werden Werte immer in den höchsten Typen, der in dieser Hierarchie vertreten ist, umgewandelt. Diese Regelung werfen char und float allerdings gleich wieder aus dem Fenster, denn für Bewertungen und Berechnungen werden float-Werte in double-Werte umgewandelt und char-Werte in int-Werte. Solltest du allerdings || oder && verwenden, so findet keine Typerweiterung statt, sondern eine Einschränkung, die alle Werte auf 0 und 1 reduziert.