2.5 Primitive Datentypen Wir unterscheiden 5 primitive Datentypen: ganze Zahlen -2, -1, -0, -1, -2,... reelle Zahlen 0.3, 0.3333..., π, 2.7 10 4 Zeichen a, b, c,... Zeichenreihen "Hello World", "TIFI", "%$&", "",... Wahrheitswerte false,true Zeichenreihen sind eigentlich kein primitiver Datentyp. Wir behandeln sie hier aber dennoch. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 88
Vier Repräsentationen ganzer Zahlen Datentyp Größe Darstellungsbereich byte 1 Byte -128,..., 127 short 2 Byte -32768,...,32767 int 4 Byte -21474833648,..., 21474833647 long 8 Byte -9223372036854775808,..., 9223372036854775807 Allgemein: k Bytes enthalten n = 8k Bits. Mit diesen werden die Zahlen 2 n 1,..., 2 n 1 1 dargestellt. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 89
Darstellung ganzer Zahlen im 2-Komplement Im 2-Komplement mit n Bits repräsentiert die Bitfolge d n 1... d 0 die ganze Zahl x = d n 1 2 n 1 + P n 2 i=0 d i2 i Beispiel: n = 4, x = d 3 2 3 + P 2 i=0 d i2 i d 3 d 2 d 1 d 0 x 0 1 1 1 7 0 1 1 0 6 0. 1 0 1 5. 0 0 0 0 0 1 1 1 1-1 1 1 1 0-2 1. 1 0 1-3. 1 0 0 1-7 1 0 0 0-8 Berechnung des n-bit 2-Komplements einer Zahl x 0: for (i=0; i<=n-2; i++) { Out.println(x%2); x = x/2; } /* Bitreihenfolge beachten! */ Out.println(0); /* Vorzeichenbit für x 0 */ Berechnung des n-bit 2-Komplements einer Zahl x < 0: 1) berechne die d i für x wie oben; 2) invertiere alle Bits 3) addiere 1 Bsp. für x = 7 x = 0111 invertieren: 1000 1 addieren: 1001 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 90
Darstellung ganzer Zahlen im 2-Komplement Im 2-Komplement mit n Bits repräsentiert die Bitfolge d n 1... d 0 die ganze Zahl x = d n 1 2 n 1 + P n 2 i=0 d i2 i Beispiel: n = 4, x = d 3 2 3 + P 2 i=0 d i2 i d 3 d 2 d 1 d 0 x 0 1 1 1 7 0 1 1 0 6 0. 1 0 1 5. 0 0 0 0 0 1 1 1 1-1 1 1 1 0-2 1. 1 0 1-3. 1 0 0 1-7 1 0 0 0-8 Addition zweier Zahlen im 2-Komplement: 0 0 1 1 3 + 1 0 1 1-5 = 1 1 1 0-2 Überlauftest bei Addition zweier Zahlen im 2-Komplement: Schreibe das jeweils erste Bit noch einmal hin. Addiere ganz normal und vergleiche die ersten beiden Bits des Ergebnisses. Bei Gleichheit ist das Ergebnis OK, sonst nicht. 0 0 1 1 1 7 + 0 0 0 0 1 1 = 0 1 0 0 0-8 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 91
Zwei Repräsentationen reeller Zahlen Datentyp Größe Vorzeichen Exponent Mantisse float 4 Byte 1 Bit 8 Bits 23 Bits double 8 Byte 1 Bit 11 Bits 52 Bits Die Repräsentationen float und double heißen Gleitkommazahlen. Die Codierung von Gleitkommazahlen x ist dreigeteilt: X XXXXXXXX... XXXXXXXXXXXXXXXXXXXXXXX... Vorzeichen s Exponent e Mantisse f s = 0 genau dann wenn die Gleitkommazahl x 0 ist. e liefert den Exponenten für einen Faktor 2 z. f = f 1 f 2... f k wird interpretiert als P k i=1 f i 2 i, d.h. als eine Zahl aus [0, 1[. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 92
Zwei Repräsentationen reeller Zahlen Datentyp Größe Vorzeichen Exponent Mantisse float 4 Byte 1 Bit 8 Bits 23 Bits double 8 Byte 1 Bit 11 Bits 52 Bits X XXXXXXXX... XXXXXXXXXXXXXXXXXXXXXXX... Vorzeichen s Exponent e Mantisse f Wert(float) = 8 < : ( 1) s 2 e 127 1.f falls 0 < e < 255 (normalisiert) ( 1) s 2 126 0.f falls e = 0 (subnormal) ( 1) s falls e = 255 (unendlich, NaN) Wert(double) = 8 < : ( 1) s 2 e 1023 1.f falls 0 < e < 2047 (normalisiert) ( 1) s 2 1022 0.f falls e = 0 (subnormal) ( 1) s falls e = 2047 (unendlich, NaN) Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 93
Größte und kleinste darstellbare Gleitkommazahlen Die größte mit float darstellbare Zahl liegt knapp unter 2 254 127 {z } e=254 2 {z} f=1 2 23 = 2 128 3.4 10 38 0 11111110 11111111111111111111111 Vorzeichen Exponent Mantisse Die kleinste positive mit float darstellbare Zahl ist 2 126 {z } e=0 2 23 {z} f=2 23 = 2 149 1.4 10 45 0 00000000 00000000000000000000001 Vorzeichen Exponent Mantisse Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 94
Größte und kleinste darstellbare Gleitkommazahlen Die größte mit double darstellbare Zahl liegt knapp unter 2 2046 1023 {z } e=2046 2 {z} f=1 2 52 = 2 1024 1.8 10 308 0 11111111110 1111111111111111111111111111111111111111111111111111 Vorzeichen Exponent Mantisse Die kleinste positive mit double darstellbare Zahl ist 2 1022 2 52 = 2 1074 4.9 10 324 0 00000000000 0000000000000000000000000000000000000000000000000001 Vorzeichen Exponent Mantisse Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 95
Addition und Multiplikation von Gleitkommazahlen Multiplikation: (Exponenten addieren, Mantissen multiplizieren) Beispiel (float): 12 20 = 1.5 2 3 1.25 2 4 = 1.5 1.25 2 3 2 4 = 1.875 2 7 = 240 Addition: (Exponenten angleichen, Mantissen addieren) Beispiel (float): 12 + 20 = 1.5 2 3 + 1.25 2 4 = 0.75 2 4 + 1.25 2 4 = (0.75 + 1.25) 2 4 = 1 2 5 = 32 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 96
Genauigkeit und Fehler bei Gleitkommazahlen Beispiel: 1024 + 1 1048576 = 1 2 10 + 1 2 20 = 1 2 10 + 2 30 2 10 = 1 2 10 + 0 2 10 = 1024 Bei 23 Bits für die Mantisse ist 2 30 nicht mehr darstellbar. In der Gleitkommaarithmetik hat die Gleichung (1 + x) = 1 für x > 0 Lösungen (wähle x wie im obigen Beispiel klein genug)! Die kleinste positive darstellbare Zahl ɛ, für die in der Gleitkommaarithmetik 1 + ɛ > 1 gilt, heißt Maschinengenauigkeit. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 97
Fehler und Geschwindigkeit bei Gleitkommazahlen Assoziativgesetz und Distributivgesetz gelten in der Gleitkommaarithmetik nicht: (x + y) + z Gɛ x + (y + z) bzw. x (y + z) Gɛ x y + x z Beweis (Nichtassoziativität): Es sei ε die Maschinengenauigkeit. 1 + ( ε 2 + ε 2 ) = Gε 1 + ε Gε 1 = Gε 1 + ε 2 = Gε (1 + ε 2 ) + ε 2 Gleitkommazahlen können gerundete Näherungen reller Zahlen sein. Durch gerundete Näherungen entstehen Rundungsfehler. Rundungsfehler können sich in Rechnungen fortpflanzen und wachsen. Die Numerik beschäftigt sich mit dem bedachten Umgang mit Gleitkommazahlen! Gleitkommaarithmetik ist deutlich langsamer als Ganzzahlarithmetik. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 98
Der Datentyp Character (char) char dienen zur Darstellung von Zeichen. Codierung: 2 Byte breite Zahlen. Für Java gewählte Standardcodierung: Unicode (www.unicode.org/charts). Zeichen... 1 2... A B... a b... Codierung 49 50 65 66 97 98 Durch die Codierung in Zahlen kann man chars vergleichen (<,<=,!=,...). Also gilt 0 < 1 <... < A < B <... < a < b <... Es gibt Sonderzeichen, die durch Escape-Sequenzen dargestellt werden: \n repräsentiert den Zeilenumbruch. \r repräsentiert den Cursorrücklauf. \ repräsentiert das Apostroph. \\ repräsentiert den Backslash.... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 99
Zeichenreihen (Strings) Strings sind Folgen von chars. Darstellung in Java in Doppelhochkommata "bla" statt Hochkommata a (wie bei char). String ist eigentlich kein primitiver Datentyp sondern eine Java-Klasse, die in einer Standard- Bibliothek implementiert ist. Für Strings gibt es viele nützliche Operationen: String a = a + "Wld"; // hängt dem String, auf den a verweist, den String "Wld" an. int b = a.length(); // legt die Anzahl der chars im String a in der Variablen b ab. char c = a.charat(3); // speichert das dritte Zeichen des Strings a unter c ab. int i = a.indexof("sub"); // liefert die Position des ersten Auftretens des Substrings "sub" im String a und speichert sie in der Variablen i; int j = Integer.parseInt("123"); // Speichert den Wert 123, der als String eingelesen wird, als ganzzahligen Wert in der Variablen j ab. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 100
Typisierung In Java haben Variablen einen eindeutig definierten Typ. Der Typ wird bei der Deklaration festgelegt: Konstanten int n; double x; Der Wert einer Variablen kann durch Verwendung des Schlüsselworts final fixiert werden: final int MAX GRAD = 360; final double PI = 3.1415926536; Solche benannten Konstanten können die Lesbarkeit verbessern. Sie können die Programmierarbeit erleichtern. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 101
Variablendeklaration Syntax <VarDekl> ::= <Typ> <Bezeichner>[ = <Ausdruck>] {, <Bezeichner>[ = <Ausdruck>]} <Bezeichner> ::= <Buchstabe> {<Buchstabe> <Ziffer>} <Typ> ::= int long byte short double float char String Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 102
Typisierung von Ausdrücken Operatoren Abhängig vom Typ der Operanden ist für jeden Operator festgelegt, welchen Typ das Ergebnis hat: Ausdrücke int n,m; double x,y; 1 2 \\ Ergebnis ist vom Typ int n + m \\ Ergebnis ist vom Typ int x / y \\ Ergebnis ist vom Typ double x < y \\ Ergebnis ist vom Typ boolean Der Ergebnistyp eines Ausdrucks ergibt sich induktiv anhand seines Ableitungsbaumes. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 103
Polymorphie (Überladung) Der Operator + ist für die Addition von Integern vergeben. Wir möchten aber auch zwei Zahlen vom Typ double mit demselben Symbol addieren! Lösung: Überladen des Operators + : Die Typen der Operanden sind bekannt. Man kann sie benutzen, um den Operator eindeutig zu identifizieren. So wird der Operator + "vielgestaltig"(polymorph):.+. : int int int.+. : double double double.+. : String String String Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 104
Implizite Typumwandlungen Durch Konvertierung (Umwandlung) von Typen werden Operatoren noch mehr Gestalten gegeben:. +. : int double double. +. : int String String. +. : double String String Dabei wird der Wert der Variable vom Typ int vor Ausführung des + -Operators in den Wert einer Variable vom Typ double umgerechnet. Wenn keine Daten verloren gehen, wird eine solche Umwandlung automatisch vorgenommen (implizite Typumwandlung). Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 105
Explizite Typumwandlungen Implizite Typumwandlungen existieren nicht für alle Operationen. Manchmal sind implizite Typumwandlungen auch unerwünscht. Daher kann man explizit angeben wie umgewandelt werden soll: <TypeCast> ::= ( <Typ> ) <Ausdruck> Achtung: Der TypeCast-Operator bindet stärker als die numerischen Operatoren. Klammern setzen hilft auch hier: short s; int n; (short) s + n; /* Ergebnis ist vom Typ int(!) */ (short) (s + n); /* Ergebnis ist vom Typ short */ Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 106
Implizite und explizite Typumwandlungen double float long int short byte Der kleinere Operandentyp wird vor der Ausführung der Operation in den größeren Operandentyp konvertiert. Der Ausdruck bekommt dann den gleichen Typ wie seine Operanden, zumindest aber den Typ int. Beispiele: double d; float f; int i; short s; String str; f = i; d = 3.14; f = 3.14f; /* ok */ i = f; f = 3.14; /* wrong */ i = (int) f; /* ok, aber Nachkommastellen gehen verloren */... f + i... /* ist float */... d*(f + i)... /* ist double */... s+s... /* ist int */... f/3... (float) i/3... /* sind float */... i/3... /* ist int */... str + i... str + f... str + d... str + s /* sind String */ Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 107