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 » ¾ ½ Rainer Feldmann Universität Paderborn Zeichenreihen sind eigentlich kein primitiver Datentyp. Wir behandeln sie hier aber dennoch. Technische Informatik für Ingenieure (TIFI) ¼ WS 09/10 88 Vier Repräsentationen ganzer Zahlen Datentyp byte short int long Größe 1 Byte 2 Byte 4 Byte 8 Byte Darstellungsbereich -128, ..., 127 -32768, ... ,32767 -21474833648, ... , 21474833647 -9223372036854775808, ... , 9223372036854775807 ¾ » Allgemein: k Bytes enthalten n = 8k Bits. Mit diesen werden die Zahlen −2n−1, ..., 2n−1 − 1 dargestellt. ½ Rainer Feldmann 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 dn−1 . . . d0 die ganze Zahl Pn−2 x = −dn−12n−1 + i=0 di2i P2 Beispiel: n = 4, x = −d323 + i=0 di2i d3 0 0 0 ... 0 1 1 1 ... 1 1 d2 1 1 1 d1 1 1 0 d0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 Rainer Feldmann Universität Paderborn x 7 6 5 ... 0 -1 -2 -3 ... -7 -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 di für −x wie oben; 2) invertiere alle Bits 3) addiere 1 Technische Informatik für Ingenieure (TIFI) Bsp. für x = −7 |x| = 0111 invertieren: 1000 1 addieren: 1001 WS 09/10 90 Darstellung ganzer Zahlen im 2-Komplement Im 2-Komplement mit n Bits repräsentiert die Bitfolge dn−1 . . . d0 die ganze Zahl Pn−2 x = −dn−12n−1 + i=0 di2i Beispiel: n = 4, x = −d323 + d3 0 0 0 ... 0 1 1 1 ... 1 1 d2 1 1 1 d1 1 1 0 d0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 Rainer Feldmann Universität Paderborn x 7 6 5 ... 0 -1 -2 -3 ... -7 -8 P2 i d 2 i i=0 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 Technische Informatik für Ingenieure (TIFI) WS 09/10 91 Zwei Repräsentationen reeller Zahlen Datentyp float double Größe 4 Byte 8 Byte Vorzeichen 1 Bit 1 Bit Exponent 8 Bits 11 Bits Mantisse 23 Bits 52 Bits • Die Repräsentationen float und double heißen Gleitkommazahlen. • Die Codierung von Gleitkommazahlen x ist dreigeteilt: X Vorzeichen s XXXXXXXX. . . Exponent e XXXXXXXXXXXXXXXXXXXXXXX. . . Mantisse f ' $ s = 0 genau dann wenn die Gleitkommazahl x ≥ 0 ist. e liefert den Exponenten für einen Faktor 2z . Pk −i f = f1f2 . . . fk wird interpretiert als i=1 fi · 2 , d.h. als eine Zahl aus [0, 1[. & Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 % 92 Zwei Repräsentationen reeller Zahlen Datentyp float double X Vorzeichen s Größe 4 Byte 8 Byte Vorzeichen 1 Bit 1 Bit XXXXXXXX. . . Exponent e Mantisse 23 Bits 52 Bits XXXXXXXXXXXXXXXXXXXXXXX. . . Mantisse f 8 s e−127 × 1.f < (−1) × 2 s −126 Wert(float) = (−1) × 2 × 0.f : (−1)s × ∞ 8 s e−1023 × 1.f < (−1) × 2 Wert(double) = (−1)s × 2−1022 × 0.f : (−1)s × ∞ Rainer Feldmann Universität Paderborn Exponent 8 Bits 11 Bits falls 0 < e < 255 falls e = 0 falls e = 255 falls 0 < e < 2047 falls e = 0 falls e = 2047 Technische Informatik für Ingenieure (TIFI) (normalisiert) (subnormal) (unendlich, NaN) (normalisiert) (subnormal) (unendlich, NaN) WS 09/10 93 Größte und kleinste darstellbare Gleitkommazahlen Die größte mit float darstellbare Zahl liegt knapp unter 254−127 2 | {z } · e=254 0 Vorzeichen 2 |{z} = 2128 ≈ 3.4 · 1038 f =1−2−23 11111110 Exponent 11111111111111111111111 Mantisse Die kleinste positive mit float darstellbare Zahl ist −126 −23 −149 2 ≈ 1.4 · 10−45 | {z } · 2 |{z} = 2 e=0 0 Vorzeichen Rainer Feldmann Universität Paderborn f =2−23 00000000 Exponent 00000000000000000000001 Mantisse 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 0 Vorzeichen 2046−1023 {z e=2046 11111111110 Exponent }· 2 |{z} = 21024 ≈ 1.8 · 10308 f =1−2−52 1111111111111111111111111111111111111111111111111111 Mantisse Die kleinste positive mit double darstellbare Zahl ist 2−1022 · 2−52 = 2−1074 ≈ 4.9 · 10−324 0 Vorzeichen 00000000000 Exponent Rainer Feldmann Universität Paderborn 0000000000000000000000000000000000000000000000000001 Mantisse Technische Informatik für Ingenieure (TIFI) WS 09/10 95 Addition und Multiplikation von Gleitkommazahlen Multiplikation: (Exponenten addieren, Mantissen multiplizieren) Beispiel (float): 12 1.5 · 23 1.5 · 1.25 1.875 ∗ ∗ ∗ ∗ 20 1.25 · 24 23 · 24 27 = = = = 240 Addition: (Exponenten angleichen, Mantissen addieren) Beispiel (float): 12 1.5 · 23 0.75 · 24 (0.75 + 1.25) 1 Rainer Feldmann Universität Paderborn + + + ∗ ∗ 20 1.25 · 24 1.25 · 24 24 25 = = = = = Technische Informatik für Ingenieure (TIFI) 32 WS 09/10 96 Genauigkeit und Fehler bei Gleitkommazahlen Beispiel: 1 1048576 −20 = + 2−30 · 210 = + 0 · 210 = 1024 + 1 · 210 + 1 · 210 1 · 210 1·2 = 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. Rainer Feldmann 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 6=G² x + (y + z) bzw. x · (y + z) 6=G² x · y + x · z Beweis (Nichtassoziativität): Es sei ε die Maschinengenauigkeit. 1 + ( 2ε + 2ε ) =Gε 1 + ε 6=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. Rainer Feldmann 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 Codierung ... ’1’ 49 ’2’ 50 ... ’A’ 65 ’B’ 66 ... ’a’ 97 ’b’ 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. – ... Rainer Feldmann 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 StandardBibliothek 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. Rainer Feldmann 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: int n; double x; Konstanten • 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. Rainer Feldmann 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 | ··· Rainer Feldmann 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: int n,m; double x,y; 1 n x x ∗ 2 + m / y < y \\ \\ \\ \\ Ergebnis Ergebnis Ergebnis Ergebnis ist ist ist ist vom vom vom vom Typ Typ Typ Typ int int double boolean Ausdrücke • Der Ergebnistyp eines Ausdrucks ergibt sich induktiv anhand seines Ableitungsbaumes. Rainer Feldmann 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): .+. .+. .+. Rainer Feldmann Universität Paderborn : : : int × int → int double × double → double String × String → String 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). Rainer Feldmann 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 */ Rainer Feldmann 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; i = f; f = 3.14; i = (int) f; ... ... ... ... ... ... Rainer Feldmann Universität Paderborn /* ok */ /* wrong */ /* ok, aber Nachkommastellen gehen verloren */ f + i ... d*(f + i) ... s+s ... f/3 ... (float) i/3 ... i/3 ... str + i ... str + f ... str + d ... str + s /* ist float /* ist double /* ist int /* sind float /* ist int /* sind String Technische Informatik für Ingenieure (TIFI) */ */ */ */ */ */ WS 09/10 107