Datentypen in C
Datentypen in C
In der Programmiersprache C sind Datentypen die Grundlage jeder Variablendeklaration und bestimmen:
- die Art der gespeicherten Werte (z. B. Ganzzahlen, Fließkommazahlen, Zeichen),
- die Speichergröße,
- den Wertebereich,
- und die Art der Operationen, die auf diesen Daten erlaubt sind.
Datentypen in C lassen sich in grundlegende (primitive), abgeleitete, benutzerdefinierte und void-Typen unterteilen.
---
Übersicht
| Kategorie | Beispiele | Beschreibung |
|---|---|---|
| Grundlegende Typen | int, float, char |
Basisdatentypen der Sprache |
| Abgeleitete Typen | array, pointer, struct |
Aus bestehenden Typen zusammengesetzt |
| Benutzerdefinierte Typen | typedef, enum, union |
Durch Programmierer definierbar |
| Spezieller Typ | void |
Bedeutet „kein Wert“ oder „kein Rückgabewert“ |
---
Grundlegende (primitive) Datentypen
C definiert mehrere elementare Datentypen für Zahlen, Zeichen und Gleitkommazahlen.
Ganzzahltypen
Ganzzahlen können vorzeichenbehaftet (signed) oder vorzeichenlos (unsigned) sein.
| Typ | Speichergröße (typisch) | Wertebereich (signed) | Wertebereich (unsigned) |
|---|---|---|---|
char |
1 Byte (8 Bit) | −128 … 127 | 0 … 255 |
short |
2 Byte (16 Bit) | −32 768 … 32 767 | 0 … 65 535 |
int |
4 Byte (32 Bit) | −2 147 483 648 … 2 147 483 647 | 0 … 4 294 967 295 |
long |
8 Byte (64 Bit) | −9 223 372 036 854 775 808 … 9 223 372 036 854 775 807 | 0 … 18 446 744 073 709 551 615 |
Beispiel:
int zahl = 42;
unsigned int u_zahl = 255;
short klein = -100;
---
Fließkommazahltypen
C unterstützt drei standardisierte Gleitkommatypen für Dezimalzahlen:
| Typ | Speichergröße | Genauigkeit | Beispielwert |
|---|---|---|---|
float |
4 Byte | ca. 6 Stellen | 3.14f |
double |
8 Byte | ca. 15 Stellen | 3.14159265358979 |
long double |
≥ 10 Byte | ≥ 18 Stellen | 3.141592653589793238L |
Beispiel:
float pi = 3.14f;
double e = 2.718281828;
long double g = 9.81L;
---
Zeichentyp
Der Typ char dient zur Darstellung einzelner Zeichen:
char buchstabe = 'A';
Da char intern numerisch gespeichert wird, gilt:
printf("%d", buchstabe); // Ausgabe: 65 (ASCII-Code)
---
Schlüsselwort _Bool
Seit C99 gibt es den Typ _Bool (Header <stdbool.h> mit Alias bool):
#include <stdbool.h>
bool fertig = true;
---
Erweiterte Standardtypen aus <stdint.h>
Seit C99 enthält die Header-Datei <stdint.h> portierbare Ganzzahltypen mit fester Bitbreite.
| Typ | Breite | Bereich | Beschreibung |
|---|---|---|---|
int8_t / uint8_t |
8 Bit | −128 … 127 / 0 … 255 | exakt 1 Byte |
int16_t / uint16_t |
16 Bit | −32 768 … 32 767 / 0 … 65 535 | 2 Byte |
int32_t / uint32_t |
32 Bit | −2 147 483 648 … 2 147 483 647 / 0 … 4 294 967 295 | 4 Byte |
int64_t / uint64_t |
64 Bit | −2⁶³ … 2⁶³−1 / 0 … 2⁶⁴−1 | 8 Byte |
Beispiel:
#include <stdint.h>
uint8_t byte = 255;
int16_t wert = -1000;
---
Abgeleitete Datentypen
Diese Typen basieren auf den Grundtypen und erweitern sie funktional.
Arrays
Ein Array ist eine Sammlung gleichartiger Werte im Speicher:
int zahlen[3] = {1, 2, 3};
printf("%d\n", zahlen[0]); // Ausgabe: 1
Zeiger (Pointer)
Zeiger speichern Speicheradressen anderer Variablen:
int x = 42;
int* p = &x;
printf("%d\n", *p); // Dereferenzierung → 42
Strukturen (struct)
Strukturen fassen unterschiedliche Datentypen zusammen:
struct Person {
char name[20];
int alter;
};
struct Person p = {"Anna", 25};
printf("%s ist %d Jahre alt\n", p.name, p.alter);
Union
Eine Union speichert mehrere Datentypen im selben Speicherbereich:
union Zahl {
int i;
float f;
};
union Zahl z;
z.i = 42;
printf("%d\n", z.i);
Aufzählung (enum)
Enumerationen definieren symbolische Konstanten:
enum Wochentag { MONTAG, DIENSTAG, MITTWOCH };
enum Wochentag heute = DIENSTAG;
typedef
Ermöglicht die Definition neuer Typnamen:
typedef unsigned char byte;
byte data = 255;
---
Der void-Typ
void bezeichnet die Abwesenheit eines Wertes oder Typs.
- Als Funktionsrückgabe:
void print(void) {
printf("Hallo Welt\n");
}
- Als Zeiger:
void* ptr;
ptr = malloc(100);
→ ein generischer Zeiger auf beliebige Datentypen.
---
Typkonvertierungen (Casting)
C erlaubt die explizite Umwandlung eines Wertes in einen anderen Typ:
int i = 10;
float f = (float)i / 4; // → 2.5
Auch implizite (automatische) Typumwandlungen finden statt, z. B. bei arithmetischen Operationen zwischen int und double.
---
Speicherbedarf prüfen
Die Funktion sizeof() gibt die Größe eines Datentyps in Byte zurück:
printf("sizeof(int): %zu\n", sizeof(int));
printf("sizeof(double): %zu\n", sizeof(double));
---
Zusammenfassung
| Kategorie | Beispiele | Beschreibung |
|---|---|---|
| Primitive Typen | int, float, char, double | Basis der Sprache |
| Erweiterte Typen | uint8_t, int32_t, size_t | feste Bitbreite |
| Abgeleitete Typen | Pointer, Array, Struct, Union | zusammengesetzte Daten |
| Benutzerdefinierte Typen | typedef, enum | neue logische Typen |
| Sondertyp | void | kein Wert / generischer Zeiger |
Siehe auch
- stdint.h
- Datentypumwandlung (C)
- Zeiger (C)
- Struktur (C)
- uint8_t
- Enum (C)
- Speicherverwaltung (C)
- sizeof (Operator)
---
Quellen
- ISO/IEC 9899:2018 (C18) – Programming Language C
- Kernighan, Brian W.; Ritchie, Dennis M.: The C Programming Language, 2nd Edition
- The GNU C Library Documentation
- Linux Man Pages:
man sizeof,man stdint - Michael Kerrisk: The Linux Programming Interface, 2010