EinheitDatentypen in der Programmiersprache CSchwerpunkt: Elementare (arithmetische) Datentypen
Kurs C/C++ Programmierung, WS 2008/2009
Dipl.Inform. R. SpurkArbeitsgruppe „Programmierung“
FR 6.2 Informatik
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 1 / 32
Überblick: Typen und Datentypen in der Programmiersprache C
Überblick: Typen in der Programmiersprache C
• Laut den ANSI/ISO Standards gibt es in C drei Klassen von Typen:
• Objekt-Typen ( = Daten-Typen):+ Datentypen, z.B. int, beschreiben Variablen, z.B. int a;
• Funktionstypen:+ Funktions-Prototypen wie etwa „int f (void)“, dienen derVorwärts-Deklaration von Funktionen(falls zyklische Abhängigkeiten zwischen Funktionen existieren)
• unvollständige Typen (void):+ Typ void bezeichnet eine leere Menge und wird bspw. verwendet, wenneine Funktion keinen Rückgabe-Wert oder keine Übergabe-Parameter hat.
• Im Folgenden: Elementare Datentypen
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 2 / 32
Elementare Datentypen in der Programmiersprache C
Elementare (einfache) Datentypen der Programmiersprache C (1)
• Die elementaren Datentypen von C:
• Ganzzahlige Typen (char, int)+ unterschiedliche Genauigkeiten für int durch voranstellen von:short, long, long long; auch noch von signed und unsigned.
• Gleitpunkt-Typen(float „einfache Genauigkeit“; double “doppelte Genaunigkeit)
+ long kann double vorangestellt werden.
• Aufzählungstypen bilden zusammen mit den Ganzzahligen Typen die Klasseder Integer-Typen.
• Der Datentyp (einer Variablen) legt die Darstellung einer Variablen durchden Compiler fest.
Durch diese Darstellung wird festgelegt:• Speicherbedarf (durch wieviele Bits wird Variable repräsentiert?)• Wertebereich• Genauigkeit (bei Gleitpunkt-Typen).
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 3 / 32
Elementare Datentypen in der Programmiersprache C
Einfache arithmetische Datentypen der Programmiersprache C (1)Datentyp Verwendung Wertebereich Größe
charkleine natürliche Zahl mit Vorzei-chen oder Zeichen
−128 . . . 127 1 Byte
unsignedchar
kleine natürl. Zahl ohne Vorzei-chen
0 . . . 255 1 Byte
intnatürliche Zahl −231 . . . 231 − 1 4 Byte
unsigned intnatürliche Zahl ohne Vorzeichen 0 . . . 232 − 1 4 Byte
floatDezimalzahl 3.4e + /− 38
(7-stellig)4 Byte
doubleDezimalzahl 1.7e + /− 308
(15-stellig)8 Byte
long doubleDezimalzahl 1.1e + /− 4932 10 Byte
• Größenangaben : abhängig von verwendeter Computerachitektur;• Angaben gelten für die (noch) üblichen 32-Bit Architekturen.• Zusätzliche Varianten an Ganzzahl-Typen:
• signed / unsigned : möglich mit char und int• short : möglich mit int• long : möglich mit int und double
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 4 / 32
Elementare Datentypen in der Programmiersprache C
Elementare (einfache) Datentypen der Programmiersprache C (2)
• Allgemein muss die folgende Ungleichung gelten:
+ char <= short int <= int <= long int <= long long int
+ float <= double <= long double
• Die in der Implementierung tatsächlich verwendeten Größen befinden sich in:
<limits.h> und <float.h>.
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 5 / 32
Ganzzahl Datentypen
• Ganzzahl-Datentyp:
int mit Variationen
(short, long, long long; signed, unsigned)
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 6 / 32
Ganzzahl Datentypen
2-er Komplement-Repräsentation von vorzeichenbehafteten Ganzzahlen
• Feststellung: nsymmetrischen Wertebereiche für positive und negativeBereiche:
+ z.B. short Þ mindest und typische Bitanzahl 16 + Wertebereich:−215 . . . 215 − 1 (−32.768 · · ·+ 32767)* 2er-Komplement Repräsentation von negativen Ganzzahl-Werten
• Warum 2er-Komplement-Bildung?Motto „statt b von a zu subtrahieren, addiere die Negation von b zu a!“
• 2er-Komplement-Bildung:Negation einer Zahl: Invertiere zunächst ihre Binärdarstellung undaddiere anschließend den Wert 1 hinzu!z.B. der Zahl 2:binär: 000000102 : erst alle Bits invertieren: 111111012,dann addiere eine 1: Ergebnis: 111111102 ( = −2 ).
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 7 / 32
Ganzzahl Datentypen
2-er Komplement-Repräsentation von vorzeichenbehafteten Ganzzahlen
• Beispiel 1: Rechnen in 2er-Komplement-Repräsentation: Subtraktion
#include <stdio.h>int main(void){
short a = 50; /* short-Zahlen: a,b,c */short b = 500; /* also 16 Bit-Zahlen */short c; /* => -32.768 ... 32.767 */
c = a - b;printf("%i", c); /* Ausgabe: -450 ,wie erwartet */return 0;
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 8 / 32
Ganzzahl Datentypen
2-er Komplement-Repräsentation von vorzeichenbehafteten Ganzzahlen
• Beispiel 2: Rechnen in 2er-Komplement-Repräsentation:Multiplikation mit negativem Multiplikator
#include <stdio.h>int main(void){
short a = 50; /* short-Zahlen: a,b,c */short b = -500; /* also 16 Bit-Zahlen */short c; /* => -32.768 ... 32.767 */
c = a * b;printf("%i", c); /* Ausgabe: -25000 ,wie erwartet */return 0;
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 9 / 32
Ganzzahl Datentypen
Ganzzahl-Arithmetik: Über- oder Unterlauf gefährdet!
• Beispiel 3: Rechnen in 2er-Komplement-Repräsentation:Multiplikation mit Überlauf50 ∗ 1000 = 50000 ;Þ als Multiplikation auf short-Größen: Ergebnis −15.536 * Überlauf!
#include <stdio.h>int main(void){
short a = 50; /* short-Zahlen: a,b,c */short b = 1000; /* also 16 Bit-Zahlen */short c; /* => -32.768 ... 32.767 */
c = a * b;printf("%i", c); /* Ausgabe: -15.536 statt 50.000 !*/return 0;
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 10 / 32
Ganzzahl Datentypen
Ganzzahl-Arithmetik: Über- oder Unterlauf gefährdet!
• Beispiel 4: Rechnen in 2er-Komplement-Repräsentation:Multiplikation mit Überlauf50 ∗ −1000 = −50000 ;Þ als Multiplikation auf short-Größen: Ergebnis 15.536 * Überlauf!
#include <stdio.h>int main(void){
short a = 50; /* short-Zahlen: a,b,c */short b = -1000; /* also 16 Bit-Zahlen */short c; /* => -32.768 ... 32.767 */
c = a * b;printf("%i", c); /* Ausgabe: 15.536 statt -50.000 !*/return 0;
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 11 / 32
Ganzzahl Datentypen
Ganzzahl-Bereiche in C-Compilern (1)
Neben der 2er-Komplement-Repräsentationgibt es noch zwei weitere Verfahren, um Zahlen zu negieren; beide werdenebenfalls vom C-Standard für Compiler akzeptiert:
• Einer-Komplement-Repräsentation:
+ wie bei 2er-Komplement – beim Negieren werden alle Bits invertiert,aber keine 1 mehr hinzuaddiert.
+ Zahlenbereich: −215 · · ·+ 215 Þ Zahlenbereich reduziert sich um 1(-32767 entfällt)
ferner: 2 verschiedene Zahlen für Wert 0: +0(00008) und −0(FFFF8).
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 12 / 32
Ganzzahl Datentypen
Ganzzahl-Bereiche in C-Compilern (2)
• Vorzeichen-Wert-Repräsentation:
+ beim Negieren wird nur Vorzeichen-Bit invertiert, alle restlichen Bitsunverändert.
+ ebenfalls: Zahlenbereich: −215 · · ·+ 215 Þ Zahlenbereich reduziertsich um 1 (-32767 entfällt)
ebenfalls: 2 verschiedene Zahlen für Wert 0: +0(00008) und −0(80008).
+ ins Compiler-Handbuch schauen, ob diese Repräsentationen grund-sätzlich eingesetzt werden oder per Compiler-Option verfügbar!
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 13 / 32
Ganzzahl Datentypen
Auch reine Positiv-Ganzzahl-Arithmetik Überlauf gefährdetUm das Schlüsselwort „unsigned“ werden Ganzzahl-Typen gekennzeichnet, dass essich um rein positive Zahlen handelt.
+ Vorzeichen-Bit nicht mehr benötigt Þ dafür größerer (positiver) Zahlenbereichmöglich: 0 · · ·+ 216 − 1, 0 · · ·+ 232 − 1, 0 · · ·+ 264 − 1.Auch die unsigned Ganzzahl-Typen sind Überlauf gefährdet:
• Beispiel 5: fehlerhafter Wert 4464 in die Ausgabe!
#include <stdio.h>int main(void){
unsigned short a = 70; /* short-Zahlen: a,b,c */unsigned short b = 1000; /* also 16 Bit-Zahlen */unsigned short c; /* => 0 ... +65.535 */
c = a * b;printf("%i", c); /* Ausgabe: 4464 statt 70.000!*/return 0;
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 14 / 32
Ganzzahl-Datentyp: char
• Ganzzahl-Datentyp: char und(Variationen: signed, unsigned)
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 15 / 32
Ganzzahl-Datentyp: char
Der Ganzzahl-Typ „char“ (1)
• Obgleich das Wort „char „ Abkürzung für “character (Schriftzeichen)„ auf einenZeichen-Typ hinweist:
+ es ist ein Ganzzahl-Typ!+ aber meist benutzt, um die Zeichen eines (7-Bit oder 8-Bit) Zeichensatzes zurepräsentieren (kodieren), z.B. ASCII-Zeichensatz.
• Größe einer Variablen vom Typ„char“, „signed char“ und „unsigned char“: 1 Byte( Þ i.a. 8 Bit (+ es könnten aber auch mehr Bits sein, bspw. 16!).
+ Es ist Compiler-abhängig, ob char dem Datentyp unsigned char odersigned char entspricht!
+ Datentyp eignet sich somit zur Darstelllung und Verarbeitung von ganzenZahlen in einem kleinen Wertebereich:unsigned char: 0 . . . 256 ; signed char: −128 . . . 127 !
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 16 / 32
Ganzzahl-Datentyp: char
Der Ganzzahl-Typ „char“ (2)
• Beispiel: char-Typ basierte, übliche Arithmetik: wie erwartet:Multplikationsergebnis: -60
#include <stdio.h>int main(void){
signed char a = 20; /* char-Zahlen: a,b,c */signed char b = -3; /* also 8 Bit-Zahlen */signed char c; /* => -128 ... +127 */
c = a * b;printf("%i", c); /* Ausgabe: 60 wie erwartet */return 0;
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 17 / 32
Ganzzahl-Datentyp: char
Der Ganzzahl-Typ „char“ (3)
Wie alle Ganzzahl-Typen:Variablen der Typen char, signed char und unsigned char sind Überlaufgefährdet!
• Beispiel: Überlauf für „signed char Typ“ Arithmetik:nicht wie erwartet: sondern fehlerhaftes Ergebnis: -88 .
#include <stdio.h>int main(void){
signed char a = 20; /* char-Zahlen: a,b,c */signed char b = -30; /* also 8 Bit-Zahlen */signed char c; /* => -128 ... +127 */
c = a * b;printf("%i", c); /* Ausgabe: -88; erwartet: -600 */return 0;
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 18 / 32
Ganzzahl-Datentyp: char
Der Ganzzahl-Typ „char“ (4)
Allerdings übliche Benutzung des Typs char: Aufnehmen einerZeichen-Kodierung:
• aber meist benutzt, um die Zeichen eines Zeichensatzes in einer (7-Bitoder 8-Bit) Zeichenkodierung zu repräsentieren;
• Zeichen sind Buchstaben wie a, B, C, d, Ziffernzeichen wie 8, 4, 6 undSonderzeichen wie ;, . ! sowie weitere Zeichen (etwa Steuerzeichen).
• eine Variable des Datentyp char nimmt wegen der 1-Byte-Größe genau1 Zeichenkodierung auf
+ mit dem Datentyp char lassen sich höchstens 256 verschiedeneZeichenkodierungen repräsentieren
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 19 / 32
Ganzzahl-Datentyp: char
Der Ganzzahl-Typ „char“ (5)
• + C-Standard: nimmt als primäre Zeichenkodierung ASCII an
mit ASCII: die ersten 128 Zeichen international festgelegt; während dierestlichen 128 regionale unterschiedliche Bedeutungen haben.
+ ASCII-Codierung einiger Zeichen:• Ziffer 0 . . . 9 : 48D . . . 57D ,• Grossbuchstaben A . . . Z: 65D . . . 90D ,• Kleinbuchstaben a . . . z: 97D . . . 122D
• Wie im Abschnitt über „Konstanten in der Programmiersprache“ gezeigt:
konstante Zeichen: in Hochkommata einschließen: z.B. 'Z'
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 20 / 32
Ganzzahl-Datentyp: char
Der Ganzzahl-Typ „char“ (5)
• Beipiel: Ausgabe eines Zeichens statt Ganzzahl:
#include <stdio.h>int main(void){
char c = ’Z’; /* char-Zeichen: ’Z’ */
printf("%c", c); /* Ausgabe: Z, wie erwartet */return 0;
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 21 / 32
Ganzzahl-Datentyp: char
Typ char: Interpretation, ob Zahl oder Zeichen? (1)
Merke:
Interpretation,ob der Inhalt einer Variablen des Typs char eine Zahl oder ein Zeichen ist,hat in C durch den Anwender zu erfolgen!
Die beiden letzten Programm-Beispiele zeigen, wie es z.B. für die Ausgabegeht:
• Wert 90 einer char-Variablen als Zahl in Dezimalnotation ausgeben:+ gib bei printf() das Format-Element %d an!
• Wert 90 einer char-Variablen als Zeichen ('Z') ausgegeben:+ gib bei printf() das Format-Element %c an!
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 22 / 32
Ganzzahl-Datentyp: char
Typ char: Interpretation, ob Zahl oder Zeichen? (1)Interpretative Spielraum, ob Zahl oder Zeichen, in der C-Programmierung ausnutzbar:Beispiel:
• Zeichen '0',. . . '9' werden durch dezimale Werte 48D . . . 57D kodiert (ASCII)
• häufig will man wissen: wurde eine Ziffer über die Tastur eingegeben?
• Hier ein mühsamer Versuch:
#include <stdio.h>int main(void){
signed char ezei; /* char fuer Eingabe */ezei = getchar(); /* einn Zeichen von Tastur */if (ezei==’0’) /* Ziffer 0 eingegeben*/ {...}else if (ezei==’1’) /* Ziffer 1 eingegeben */else ....else /* Ziffer 9 eingegeben */.....
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 23 / 32
Ganzzahl-Datentyp: char
Typ char: Interpretation, ob Zahl oder Zeichen? (2)
Beispiel (Forts.)• Interessiert Tatsache: „Wurde (irgendeine) Ziffer eingegeben?“,
so geht es in C einfacher:
#include <stdio.h>int main(void){
signed char ezei; /* char fuer Eingabe */ezei = getchar(); /* einn Zeichen von Tastur */
if ((’0’<=ezei) && (ezei<=’9’))
{...} /* Ziffer eingegeben */else {...} /* keine Ziffer eingegeben */.....
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 24 / 32
Ganzzahl-Datentyp: char
Typ char: Interpretation, ob Zahl oder Zeichen? (3)Beispiel (Forts.)
• Falls allerdings Interesse: „Welche Ziffer wurde eingegeben?“Dann geht das in C etwa so:
#include <stdio.h>int main(void){
signed char ezei; /* char fuer Eingabe */ezei = getchar(); /* einn Zeichen von Tastur */
switch ( ezei - ’0’ ) {case 0 : /* Ziffer 0 eingegeben */ break;case 1 : /* Ziffer 1 eingegeben */ break;.....case 9 : /* Ziffer 9 eingegeben */ break;default: /* keine Ziffer eingegeben! */ break;
}.....
}
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 25 / 32
Ganzzahl-Datentyp: char
• Ganzzahl-Datentyp: logischer Datentyp
(ab C99: _Bool!)
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 26 / 32
Ganzzahl-Datentyp: char
Logische Datentype in C: vor C99 und nach C99 (1)
Vor C99:
• Es gab keinen direkten logischen Datentyp!
• Statt dessen:logische Werte wurden vom Programmierer durch ganze Zahlen dargestellt;
• logische Operatoren (!, &&, ||) bzw. logische Ausdrücke (z.B. a < b) gab es in Cschon!
• Das Ergebnis logischer Auswertungen?:z.B. eine Bedingung in if-Anweisung?+ eine ganze Zahl ungleich Null = logischer Wert wahr+ eine ganze Zahl gleich Null = logischer Wert false
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 27 / 32
Ganzzahl-Datentyp: char
Logische Datentype in C: vor C99 und nach C99 (2)• Beispiel:
#include <stdio.h>int main(void){
int a = 20, b; /* a, b repr. boolesche Werte *b = !a; /* 0 (=falsch) fuer b,
da "a ungleich 0" (=wahr) ist */a = !b; /* 1 (=wahr) fuer a,
da "b gleich 0" (=falsch) ist */if ( b ) printf("b: true\n");else printf("b: false\n");if ( a ) printf("a: true\n");else printf("a: false\n");return 0;
}
Ausgabe bestätigt dies:
b: falsea: true
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 28 / 32
Ganzzahl-Datentyp: char
Logische Datentype in C: vor C99 und nach C99 (2)
Seit C99:
• Ein logischer Datentyp in C eingeführt: (Schlüsselwort) _Bool;
• aber auch diese Datentyp ist ein Ganzzahl-Typ:allerdings nur die Zahlen 0 und 1 ins seinem Wertebereich:0 für false und 1 für true.
• Zusätzlich eingeführt: Header-Datei stdbool.h : definiert• bool als Datentyp _Bool;• Konstante false als 0 und true als 1;
• + gcc (in den aktuellen Versionen) implementiert den C-Datentyp _Bool.
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 29 / 32
Ganzzahl-Datentyp: char
Logische Datentype in C: vor C99 und nach C99 (3)
• Beispiel:
#include <stdio.h>
#include <stdbool.h>
int main(void){bool a = true, b; /* bool ist _Bool! */b = !a;if ( b ) printf("b: true (%d)\n",b);else printf("b: false (%d)\n",b);if ( a ) printf("a: true (%d)\n",a);else printf("a: false (%d)\n",a);return 0;
}
Ausgabe bestätigt dies:b: false (0)a: true (1)
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 30 / 32
Gleitpunkt Datentypen
• Gleitpunkt-Datentypen:
float und double (long double)
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 31 / 32
Gleitpunkt Datentypen
Gleitpunkt-Typen
• Gleitpunkt-Typen:
• einfacher Genauigkeit: float ( 4 Bytes in der Regel);
• doppelte Genauigkeit: double ( 8 Bytes in der Regel), long double (10Bytes in der Regel)
+ Darstellung reeller Zahlen in Form Mantisse und Exponent
+ Später mehr!
R. Spurk (Informatik) Datentypen in der Programmiersprache C WS08/09 32 / 32