C-Datentypen verstehen: Umfassender Leitfaden
Datentypen in C beziehen sich auf ein umfangreiches System zur Deklaration von Variablen oder Funktionen verschiedener Typen. Der Typ einer Variablen bestimmt, wie viel Speicherplatz sie belegt und wie das gespeicherte Bitmuster interpretiert wird.
Die Typen in C können wie folgt klassifiziert werden:
| Nr. | Typen & Beschreibung |
|---|---|
| 1 | Grundtypen (Basic Types) – Arithmetische Typen, unterteilt in: (a) Ganzzahltypen und (b) Gleitkommatypen. |
| 2 | Aufzählungstypen (Enumerated types) – Ebenfalls arithmetische Typen, definieren Variablen, die nur bestimmte diskrete Ganzzahlwerte annehmen können. |
| 3 | Der Typ void – Der Typspezifizierer void zeigt an, dass kein Wert verfügbar ist. |
| 4 | Abgeleitete Typen (Derived types) – Enthalten: (a) Zeigertypen, (b) Arraytypen, (c) Strukturtypen, (d) Union-Typen, (e) Funktionstypen. |
Array- und Strukturtypen werden zusammenfassend als aggregierte Typen bezeichnet. Der Typ einer Funktion spezifiziert den Rückgabetyp der Funktion. Im Folgenden betrachten wir die Grundtypen; andere Typen folgen in späteren Kapiteln.
Ganzzahltypen (Integer Types)
Die folgende Tabelle zeigt die Standard-Ganzzahltypen mit Speichergrößen und Wertebereichen (typisch für 64-Bit-Systeme):
| Typ | Speichergröße | Wertebereich |
|---|---|---|
| char | 1 Byte | -128 bis 127 oder 0 bis 255 |
| unsigned char | 1 Byte | 0 bis 255 |
| signed char | 1 Byte | -128 bis 127 |
| int | 4 Bytes | -2.147.483.648 bis 2.147.483.647 |
| unsigned int | 4 Bytes | 0 bis 4.294.967.295 |
| short | 2 Bytes | -32.768 bis 32.767 |
| unsigned short | 2 Bytes | 0 bis 65.535 |
| long | 8 Bytes (4 Bytes auf 32-Bit) | -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 |
| unsigned long | 8 Bytes | 0 bis 18.446.744.073.709.551.615 |
Um die genaue Größe eines Typs oder einer Variablen auf einer bestimmten Plattform zu ermitteln, verwenden Sie den sizeof-Operator. Der Ausdruck sizeof(typ) liefert die Speichergröße in Bytes. Beispiel mit Konstanten aus limits.h und float.h:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
int main(int argc, char** argv) {
printf("CHAR_BIT : %d\n", CHAR_BIT);
printf("CHAR_MAX : %d\n", CHAR_MAX);
printf("CHAR_MIN : %d\n", CHAR_MIN);
printf("INT_MAX : %d\n", INT_MAX);
printf("INT_MIN : %d\n", INT_MIN);
printf("LONG_MAX : %ld\n", (long) LONG_MAX);
printf("LONG_MIN : %ld\n", (long) LONG_MIN);
printf("SCHAR_MAX : %d\n", SCHAR_MAX);
printf("SCHAR_MIN : %d\n", SCHAR_MIN);
printf("SHRT_MAX : %d\n", SHRT_MAX);
printf("SHRT_MIN : %d\n", SHRT_MIN);
printf("UCHAR_MAX : %d\n", UCHAR_MAX);
printf("UINT_MAX : %u\n", (unsigned int) UINT_MAX);
printf("ULONG_MAX : %lu\n", (unsigned long) ULONG_MAX);
printf("USHRT_MAX : %d\n", (unsigned short) USHRT_MAX);
return 0;
}
Typische Ausgabe auf Linux (64-Bit):
CHAR_BIT : 8
CHAR_MAX : 127
CHAR_MIN : -128
INT_MAX : 2147483647
INT_MIN : -2147483648
LONG_MAX : 9223372036854775807
LONG_MIN : -9223372036854775808
SCHAR_MAX : 127
SCHAR_MIN : -128
SHRT_MAX : 32767
SHRT_MIN : -32768
UCHAR_MAX : 255
UINT_MAX : 4294967295
ULONG_MAX : 18446744073709551615
USHRT_MAX : 65535
Gleitkommatypen (Floating-Point Types)
Details der Standard-Gleitkommatypen mit Speichergrößen, Wertebereichen und Genauigkeit:
| Typ | Speichergröße | Wertebereich | Genauigkeit |
|---|---|---|---|
| float | 4 Byte | 1.2E-38 bis 3.4E+38 | 6 Dezimalstellen |
| double | 8 Byte | 2.3E-308 bis 1.7E+308 | 15 Dezimalstellen |
| long double | 16 Byte (oft 10/12/16) | 3.4E-4932 bis 1.1E+4932 | 19+ Dezimalstellen |
Die Header-Datei float.h definiert Makros für diese Werte. Beispiel:
#include <stdio.h>
#include <float.h>
int main() {
printf("Speichergröße für float : %zu \n", sizeof(float));
printf("FLT_MAX : %g\n", FLT_MAX);
printf("FLT_MIN : %g\n", FLT_MIN);
printf("DBL_MAX : %g\n", DBL_MAX);
printf("DBL_MIN : %g\n", DBL_MIN);
printf("Precision (FLT_DIG): %d\n", FLT_DIG);
return 0;
}
Der void-Typ
Der void-Typ spezifiziert, dass kein Wert verfügbar ist. Er wird in drei Situationen verwendet:
| Nr. | Typ & Beschreibung |
|---|---|
| 1 | Funktionen mit void-Rückgabe – Funktionen, die keinen Wert zurückgeben. Beispiel: void exit(int status); |
| 2 | Funktionsargumente als void – Funktionen ohne Parameter. Beispiel: int rand(void); |
| 3 | Zeiger auf void – void * repräsentiert die Adresse eines Objekts ohne dessen Typ. Beispiel: void *malloc(size_t size); gibt einen Zeiger zurück, der in jeden Datentyp umgewandelt werden kann. |
C Sprache
- Elektrische Schalter verstehen: Typen, Funktionen und Anwendungen
- C# Variablen & Primitive Datentypen meistern: Der komplette Guide
- C++-Datentypen verstehen: Grundlagen, Modifizierer und Best Practices
- C Datentypen erklärt: int, float, char und mehr – Ein vollständiger Leitfaden
- Python-Datentypen meistern: Praxisleitfaden
- Java Primitive Datentypen: Vollständiger Leitfaden mit Beispielen
- C Variablen, Datentypen und Konstanten – Ein praktischer Leitfaden
- 5 Rechenzentrums-Modelle erklärt: Design, Use Cases & Beispiele
- 8 Schlüssel-Cloud-Computing-Modelle 2021
- 8 häufige Datenschutzverletzungsarten – reale Beispiele & Auswirkungen