💻
Willkommen zurück!
Datentypen in C
Fortgeschrittene Algorithmen und Programmierung
Wintersemester 2025/26
Prof. Dr. Alexandra Mikityuk
📍 Raum C308 | 🏫 HTW Berlin
Drücken Sie → oder Leertaste zum Starten
Nach der Pause wieder einsteigen
Nach einer Pause ist es normal, dass einiges "eingerostet" ist.
Keine Sorge - wir starten mit einer gründlichen Wiederholung!
💡 Unser Ziel heute:
Wir festigen die Grundlagen und vertiefen unser Verständnis von Datentypen in C.
Schritt für Schritt, mit vielen praktischen Beispielen!
- Wiederholung: Eingabe und Ausgabe
- Datentypen verstehen und richtig einsetzen
- Zahlensysteme und ihre Bedeutung
- Praktische Beispiele aus dem echten Leben
Teil 1: Grundlagen
- scanf() und Eingabeverarbeitung
- Warum Datentypen wichtig sind
- Integer-Datentypen im Detail
- Signed vs. Unsigned
Teil 2: Vertiefung
- Fließkommazahlen verstehen
- Zahlensysteme (Oktal, Hexadezimal)
- Praktische Anwendungsbeispiele
- Häufige Fehler vermeiden
Bevor wir in die Tiefe gehen, erinnern wir uns an die Grundstruktur eines C-Programms.
Jedes C-Programm folgt diesem grundlegenden Aufbau:
- Bibliotheken einbinden - Wir holen uns Funktionen, die wir brauchen
- main() Funktion - Der Startpunkt des Programms
- Variablen deklarieren - Speicherplatz reservieren
- Operationen ausführen - Ein- und Ausgabe, Berechnungen
- Rückgabewert - Programm beenden mit return 0
#include <stdio.h>
int main() {
int alter;
printf("Wie alt sind Sie? ");
scanf("%d", &alter);
printf("Sie sind %d Jahre alt.\n", alter);
return 0;
}
Was macht scanf()?
scanf() ist die wichtigste Funktion zum Einlesen von Benutzereingaben.
Sie wartet, bis der Benutzer etwas eintippt und Enter drückt, und speichert dann die Eingabe in einer Variable.
Zwei wichtige Teile:
1️⃣ Format-String (z.B. "%d") - sagt scanf, welchen Typ wir erwarten
2️⃣ Adresse der Variable (mit &) - wohin die Eingabe gespeichert werden soll
int zahl;
scanf("%d", &zahl);
float preis;
scanf("%f", &preis);
char buchstabe;
scanf(" %c", &buchstabe);
⚠️ Wichtig: Das & (Ampersand) vor dem Variablennamen ist entscheidend!
Es gibt die Speicheradresse der Variable an scanf() weiter. Ohne & kann scanf() nicht wissen,
wo die Eingabe gespeichert werden soll → Programm stürzt ab!
scanf() kann mehrere Werte in einem Aufruf einlesen:
int tag, monat, jahr;
printf("Geben Sie ein Datum ein (TT MM JJJJ): ");
scanf("%d %d %d", &tag, &monat, &jahr);
printf("Datum: %d.%d.%d\n", tag, monat, jahr);
📝 Beispiel-Eingabe:
15 10 2025
Ausgabe:
Datum: 15.10.2025
| Spezifizierer |
Datentyp |
Beschreibung |
Beispiel |
| %d oder %i |
int |
Ganze Zahl (dezimal) |
42, -17 |
| %f |
float |
Fließkommazahl |
3.14, -0.5 |
| %lf |
double |
Doppelt genaue Fließkommazahl |
3.14159265 |
| %c |
char |
Einzelnes Zeichen |
'A', '5', '@' |
| %s |
char[] |
Zeichenkette (String) |
"Hallo" |
Was ist die korrekte Syntax, um einen Integer einzulesen?
A) scanf("%d", zahl);
B) scanf("%d", &zahl);
C) scanf(&zahl, "%d");
D) scanf(zahl);
Datentypen bestimmen:
- Speicherplatz: Wie viele Bytes im Speicher belegt werden
- Wertebereich: Welche Zahlen gespeichert werden können
- Operationen: Welche Berechnungen möglich sind
- Genauigkeit: Wie präzise Berechnungen sind
💡 Analogie:
Stellen Sie sich vor, Sie sortieren Kleidung:
• char = kleine Schublade (1 Byte) - für ein Socke
• int = mittlere Schublade (4 Bytes) - für ein T-Shirt
• double = große Schublade (8 Bytes) - für eine Jacke
Integer = ganze Zahlen (ohne Nachkommastellen). C bietet verschiedene Integer-Typen
mit unterschiedlichen Größen und Wertebereichen.
Warum verschiedene Größen? Je größer der Typ, desto mehr Speicher braucht er.
Für kleine Zahlen (z.B. Alter) reicht ein kleiner Typ. Für große Zahlen (z.B. Weltbevölkerung)
brauchen wir einen größeren Typ.
| Typ |
Größe |
Wertebereich (signed) |
Praktische Verwendung |
| char |
1 Byte (8 Bit) |
-128 bis 127 |
Zeichen, sehr kleine Zahlen (Alter, Noten) |
| short |
2 Bytes (16 Bit) |
-32,768 bis 32,767 |
Kleine Zahlen (Jahr, Temperatur) |
| int |
4 Bytes (32 Bit) |
-2,147,483,648 bis 2,147,483,647 |
Standard! Bevölkerung, Entfernungen |
| long |
8 Bytes (64 Bit) |
-9,223,372,036,854,775,808 bis 9,223,... ,807 |
Sehr große Zahlen (Astronomie, Finanzen) |
💡 Faustregel: Verwenden Sie int für die meisten ganzzahligen Berechnungen.
Nur bei speziellen Anforderungen (sehr klein/groß) andere Typen wählen!
#include <stdio.h>
int main() {
char alter_katze = 5;
short hoehe_raum = 280;
int einwohner = 3850000;
long entfernung = 384400000;
printf("Katze ist %d Jahre alt\n", alter_katze);
printf("Raumhöhe: %d cm\n", hoehe_raum);
printf("Berlin: %d Einwohner\n", einwohner);
printf("Entfernung zum Mond: %ld m\n", entfernung);
return 0;
}
📝 Beachten Sie: Für long verwenden wir %ld in printf()!
Signed (mit Vorzeichen) und unsigned (ohne Vorzeichen) bestimmen,
ob eine Variable negative Zahlen speichern kann oder nicht.
Der Trick: Beide verwenden gleich viel Speicher (z.B. 4 Bytes bei int),
aber unsigned nutzt das Bit, das normalerweise für das Vorzeichen (+/-) verwendet wird,
für den Wert selbst → doppelt so große positive Zahlen möglich!
signed (mit Vorzeichen)
- ✅ Standard in C
- ✅ Kann positiv UND negativ sein
- ⚠️ Ein Bit für das Vorzeichen
- 📊 Symmetrischer Bereich um 0
signed int temp = -15;
unsigned (ohne Vorzeichen)
- ✅ Nur positive Zahlen (≥ 0)
- ✅ Doppelter positiver Bereich!
- ✅ Alle Bits für den Wert
- ⚠️ KEINE negativen Zahlen!
unsigned int alter = 25;
✅ Gute Beispiele für unsigned:
- Alter: Kann nie negativ sein
- Anzahl: Zählen von Objekten (0, 1, 2, ...)
- Größen: Dateigröße, Array-Länge
- IDs: Benutzer-IDs, Produkt-Nummern
unsigned int alter = 30;
unsigned int anzahl_studenten = 450;
unsigned long dateigroesse = 1024000;
int temperatur = -5;
Welcher Datentyp ist für die Temperatur in Celsius am besten geeignet?
A) unsigned int
B) int
C) unsigned char
D) char
💡 Tipp: Denken Sie daran, dass Temperaturen unter 0°C möglich sind!
Fließkommazahlen (auch Gleitkommazahlen) sind Datentypen für Zahlen mit Dezimalstellen.
Sie folgen dem IEEE 754 Standard und verwenden eine wissenschaftliche Notation intern.
| Typ |
Größe |
Genauigkeit |
Wertebereich |
| float |
4 Bytes (32 Bit) |
~6-7 Dezimalstellen |
±3.4 × 1038 |
| double |
8 Bytes (64 Bit) |
~15-17 Dezimalstellen |
±1.8 × 10308 |
| long double |
10-16 Bytes* |
~18-19 Dezimalstellen |
±1.1 × 104932 |
⚠️ Wichtig: Fließkommazahlen sind nicht exakt!
Sie sind Näherungswerte aufgrund der binären Darstellung. Ein einfaches Beispiel:
0.1 + 0.2 ergibt in C nicht exakt 0.3, sondern 0.30000000000000004!
💡 Hinweis: *long double Größe ist plattformabhängig (Windows, Linux, Mac können unterschiedlich sein)
float verwenden:
- Grafikanwendungen
- Einfache Berechnungen
- Speicherplatz ist knapp
- Weniger Genauigkeit OK
Beispiel:
Bildschirmkoordinaten,
Spiele-Physik
double verwenden:
- Wissenschaftliche Berechnungen
- Finanzberechnungen
- Hohe Genauigkeit nötig
- Standard in C!
Beispiel:
Banksystem,
Ingenieursberechnungen
💡 Faustregel: Im Zweifelsfall double verwenden!
Was passiert hier? Wir speichern Pi (π) in float und double.
float ~6-7 Stellen genau, double ~15-17 Stellen.
%.10f = 10 Nachkommastellen zeigen, %.20lf = 20 Stellen (l=long).
#include <stdio.h>
int main() {
float pi_float = 3.14159265358979;
double pi_double = 3.14159265358979323846;
printf("float: %.10f\n", pi_float);
printf("double: %.20lf\n", pi_double);
double radius = 5.0;
double flaeche = pi_double * radius * radius;
printf("\nKreis Radius %.2lf cm → Fläche: %.2lf cm²\n", radius, flaeche);
return 0;
}
📊 Ausgabe:
float: 3.1415927410
↑ Ungenau ab Stelle 7!
double: 3.14159265358979311600
↑ Genau bis Stelle 15!
💡 Wichtig: Für präzise Berechnungen (Wissenschaft, Finanzen) immer double verwenden!
Warum nicht nur Dezimalzahlen?
Computer arbeiten intern mit Binärzahlen (0 und 1). Um mit dem Computer zu kommunizieren,
verwenden Programmierer oft andere Zahlensysteme, die kompakter sind als Binär, aber näher an der
Hardware-Darstellung als Dezimal.
Beispiel: Die Binärzahl 11111111 ist schwer zu lesen, aber als FF (hexadezimal)
oder 377 (oktal) viel übersichtlicher!
| System |
Basis |
Ziffern |
Verwendung in der Praxis |
| Binär |
2 |
0-1 |
Computer-Hardware, Bits, Boolesche Logik |
| Oktal |
8 |
0-7 |
Unix-Dateiberechtigungen (chmod 755), alte Systeme |
| Dezimal |
10 |
0-9 |
Alltag, normale Zahlen, Benutzereingaben |
| Hexadezimal |
16 |
0-9, A-F |
RGB-Farben (#FF5733), Speicheradressen, Debugging |
💡 Fun Fact: Hexadezimal ist besonders praktisch, weil 16 = 2⁴ ist.
Jede Hex-Ziffer entspricht exakt 4 Bits (Binärziffern)! Das macht Umrechnungen sehr einfach.
Die Sprache des Computers
Computer verstehen nur zwei Zustände: An (1) oder Aus (0). Deshalb verwenden sie das
Binärsystem (Basis 2). Jede Stelle hat einen Wert: 20, 21, 22, 23, ...
Wichtig: In C gibt es keine direkte Syntax für Binärzahlen (außer in neueren Standards mit 0b Präfix),
aber das Verständnis ist fundamental!
Beispiel: Die Binärzahl 1101 → Dezimal
| Stelle: |
2³ |
2² |
2¹ |
2⁰ |
| Wert: |
8 |
4 |
2 |
1 |
| Bit: |
1 |
1 |
0 |
1 |
| Rechnung: |
1×8 |
1×4 |
0×2 |
1×1 |
= 8 + 4 + 0 + 1 = 13 (dezimal)
💡 Merkhilfe: Jede Binärstelle ist eine Potenz von 2: 1, 2, 4, 8, 16, 32, 64, 128, 256...
Das System, das wir kennen
Jede Stelle hat einen Wert: 100, 101, 102, ...
Beispiel: Die Zahl 2025
| Stelle: |
10³ |
10² |
10¹ |
10⁰ |
| Wert: |
1000 |
100 |
10 |
1 |
| Ziffer: |
2 |
0 |
2 |
5 |
| Rechnung: |
2×1000 |
0×100 |
2×10 |
5×1 |
= 2000 + 0 + 20 + 5 = 2025
Oktal: 8 Ziffern (0-7). Nach 7 kommt 10 (oktal) = 8 (dezimal).
In C: führende 0 kennzeichnet Oktal.
⚠️ Vorsicht! int x = 0100; ist NICHT 100, sondern 64 (dezimal)!
💡 Notation: Oktal=0..., Binär=0b... (C23), Hex=0x...
int oktal = 0755;
printf("Oktal 0755 = Dezimal %d\n", oktal);
int a = 100;
int b = 0100;
📐 Umrechnung 0755:
7×8² + 5×8¹ + 5×8⁰
= 7×64 + 5×8 + 5×1
= 493
💡 Praktisch:
Unix-Berechtigungen:
chmod 0755
→ rwxr-xr-x
Ziffern 0-9 und Buchstaben A-F
In C: Hexadezimalzahlen beginnen mit 0x oder 0X
| Hex: |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | A | B | C | D | E | F |
| Dez: |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
int hex = 0xFF;
printf("Hex 0xFF = Dezimal %d\n", hex);
int rot = 0xFF0000;
int gruen = 0x00FF00;
int blau = 0x0000FF;
Umrechnung: 0xFF (hex) → dezimal
F×16¹ + F×16⁰ = 15×16 + 15×1 = 240 + 15 = 255
💡 Praktisch: Hexadezimal ist kompakt für große Zahlen:
0xFFFFFFFF = 4,294,967,295 (dezimal)
| Dezimal |
Binär |
Oktal |
Hexadezimal |
In C Code |
| 0 |
0000 |
00 |
0x0 |
0, 00, 0x0 |
| 8 |
1000 |
010 |
0x8 |
8, 010, 0x8 |
| 15 |
1111 |
017 |
0xF |
15, 017, 0xF |
| 16 |
10000 |
020 |
0x10 |
16, 020, 0x10 |
| 255 |
11111111 |
0377 |
0xFF |
255, 0377, 0xFF |
int a = 255;
int b = 0377;
int c = 0xFF;
Was ist der dezimale Wert von 0x10?
A) 10
B) 16
C) 8
D) 1
💡 Tipp: 0x bedeutet hexadezimal (Basis 16)!
❌ Typische Fehler und wie man sie vermeidet:
❌ FALSCH
int x;
scanf("%d", x);
float preis;
scanf("%d", &preis);
char big = 200;
✅ RICHTIG
int x;
scanf("%d", &x);
float preis;
scanf("%f", &preis);
int big = 200;
Was haben wir gelernt?
- ✅ scanf() zum Einlesen von Benutzereingaben (mit &!)
- ✅ Integer-Typen: char, short, int, long
- ✅ signed vs. unsigned - Wann welchen verwenden?
- ✅ Float-Typen: float, double, long double
- ✅ Zahlensysteme: Dezimal, Oktal (0...), Hexadezimal (0x...)
- ✅ Häufige Fehler und wie man sie vermeidet
📚 Nächste Vorlesung:
Type Casting, Konstanten, Zufallszahlen und Operatoren!
Fragen? Üben Sie weiter!
Prof. Dr. Alexandra Mikityuk
Raum: C308
Sprechstunde: Nach Vereinbarung
Tipp: Probieren Sie die Beispiele selbst aus!
Experimentieren ist der beste Weg zum Lernen.
💻 Übung macht den Meister!
Schreiben Sie eigene kleine Programme mit verschiedenen Datentypen.