Programmierkurs Kapitel 4 Datentypen Arten von Datentypen
Transcription
Programmierkurs Kapitel 4 Datentypen Arten von Datentypen
Kapitel 4 Programmierkurs Wiederholung Kapitel 4 Birgit Engels, Anna Schulze ZAIK Universität zu Köln WS 07/08 1 / 23 Datentypen 2 Arten von Datentypen Bei der Deklaration einer Variablen(=Behälter für Werte) legt der Datentyp fest: Primitive Datentypen: I Welche Werte die Variable annehmen kann. I I Wieviel Speicherplatz die Variable belegen darf. I Welche Operationen auf die Variable angewendet werden dürfen. Ganzzahlige numerische Datentypen: int, long, ... Logischer Datentyp: boolean Rationale numerische Datentypen: float, double, ... Alphanumerischer Datentyp: char Vordefinierte Datentypen (z.B. : BufferedReader, InputStreamReader) Damit auch implizit in welchen Anweisungen sie vorkommen kann (später). Selbstdefinierte Datentypen (z.B. : Greets, Age) 3 / 23 4 Binärcodierung natürliche/ganze Zahlen 4.0 Ganzzahlige numerische Datentypen mit Operatoren byte short int Darstellung natürlicher Zahlen mit n Bits: 0 - 2n − 1 in “normaler” Binärdarstellung long Darstellung ganzer Zahlen mit n Bits: I I I Operator + + * / % = Vorzeichen-Kodierung (−2(n−1) − 1 - 2(n−1) − 1) Einerkomplement (−2(n−1) − 1 - 2(n−1) − 1) Zweierkomplement (−2(n−1) - 2(n−1) − 1) → Over-/Underflow! Beispiel +i -i a+b a-b a*b a/b a%b x=a+b Bedeutung Vorzeichen (kann weggelassen werden) Vorzeichen Summe Differenz Produkt ganzzahlige Division Rest der ganzzahligen Division (Modulo) Zuweisung 5 / 23 Operatoren für ganze Zahlen - Kurzschreibweisen Operator += -= *= /= %= int i=0; ++i; --i; Beispiel a+=b a-=b a*=b a/=b a%=b entspricht nicht: 6 Operatoren für ganze Zahlen - Vergleichsoperationen Operator </<= >/>= != == = Bedeutung a=a+b a=a-b a=a*b a=a/b a=a%b Beispiel a<b/a<=b a>b/a>=b a!=b a==b x=a<b Bedeutung Liefert wahr, Liefert wahr, Liefert wahr, Liefert wahr, Zuweisung falls falls falls falls a a a a kleiner(-gleich) b grösser(-gleich) b ungleich b ist gleich b ist Die Auswertung von Vergleichsoperationen liefert einen der logischen Werte wahr oder falsch. Die Zuweisung eines solchen Wertes erfordert links von = eine Variable des Typs boolean !. int i=0; i++; i--; 7 / 23 8 4.0 Logischer Datentyp boolean Verwechslungsgefahr Java besitzt den logischen Datentyp boolean : Wertebereich: { true, false } Kann bei Zuweisungen von logischen Ausdrücken verwendet werden. Operator == = Wird implizit bei Kontrollstrukturen verwendet. Logische Operatoren: Operator ! && || = Beispiel !i a && b a || b a = a && b Beispiel a==b x=a<b Bedeutung Liefert wahr, falls a gleich b ist Zuweisung Durch Tippfehler wird der Vergleichsoperator für den Test auf Gleichheit zweier Variablen == leicht zum Zuweisungsperator = und umgekehrt !!! Bedeutung logische Negation logisches UND logisches ODER Zuweisung 9 / 23 4.0 Typumwandlung (Typecast) I 10 Expliziter Typecast Java ist eine strikt typisierte Sprache, d.h. jede Variable besitzt einen Typ. Dieser wird vom Compiler bei der Variablendeklaration “gelernt” und “erlaubt” danach nur: Explizite Typumwandlung: Einer Variable wird explizit der Neue Typ in Klammern vorangestellt: Zuweisungen von Variablen des gleichen Datentyps. short s=123; int i; i= (int) s; Operationen, die für den Typ der Variablen definiert sind. Operationen auf Variablen gleichen Typs. Manchmal ist es dennoch nötig (und sinnvoll!), andere Zuweisungen bzw. Operationen auszuführen, daher gibt es 2 Arten von Typumwandlung (Typecast): Normale Deklaration. Normale Deklaration. Zuweisung mit explizitem Cast von short auf int Achtung: Der Typecast (kurz: Cast) ändert nicht den deklarierten Typ der Variable, sondern ermöglicht nur die Zuweisung zu einer Variable anderen Typs bzw. die Anwendung einer Operation anderen Typs. Variable s ist immernoch vom Typ short und i vom Typ int ! Expliziter Typecast Impliziter Typecast 11 / 23 12 Impliziter Typecast Impliziter Typecast - Erlaubte Typen Für einige Datentypen gibt es Typen, auf die ein impliziter Cast erlaubt ist, d.h. bei typgemischten Zuweisungen oder Operationen wird vom Compiler jede Variable automatisch in einen der beteiligten Typen umgewandelt. Dieser ist fest definiert. Implizite Typumwandlung: Eine Variable wird einer anderen von anderem, erlaubten Typ zugewiesen oder eine Operation eines solchen Typs auf sie angwandt: Beispiel byte, short, int, long: Normale Deklaration. Normale Deklaration. Zuweisung von short zu int short s=123; int i; i= s; Cast wie folgt erlaubt, da Wertebereich sich vergrössert: byte → short → int → long Der Typecast ändert auch hier nicht den deklarierten Typ der Variable !Variable s ist immernoch vom Typ short und i vom Typ int ! Cast wie folgt verboten, da Wertebereich sich verkleinert (Gefahr von Over-/Underflow): long 9 int 9 short 9 byte 13 / 23 4.0 Gleitkommazahlen 14 Rationale Numerische Datentypen (Gleitkommazahlen) Wie bereits am Beispiel einer Konstanten Im Computer wird eine rationale Zahl immer als Gleitkommazahl durch Vorzeichen, Mantisse und Exponent (zur Basis 2) repräsentiert. static final double PI=3.1415; gesehen, benötigen wir neben ganzen Zahlen natürlich auch rationale Zahlen. In Java gibt es für Gleitkommazahlen die 2 Typen float (Floating Point Number) und double (Double Precission): Jede Zahl x ∈ Q, x 6= 0 lässt sich schreiben als: x = s · m · 10e Bitanzahl für: Vorzeichen Mantisse Exponent Summe Bereich mit - Vorzeichen s ∈ {1, −1} - Mantisse m ∈ Q, 1 ≤ m < 10 - Exponent e ∈ Z. Da sich in ausgeschriebener Variante, die Position des Kommas je nach Exponent verändern würde, heisst diese Darstellung Gleitkommazahl (Floating Point Number). 15 / 23 float 1 23 8 32 1.4E − 45 − 3.4E 38 double 1 52 11 64 4.9E − 324 − 1.8E 308 16 Notation für Gleitkommazahlen Operanden für Gleitkommazahlen Die Darstellung einer Gleitkommazahl im Java-Quelltext hat die Form: Vorzeichen (optional) Vorkommastellen Operanden für Gleitkommazahlen entsprechen den arithmetischen und vergleichenden Operanden für ganze Zahlen. Dezimalpunkt Einige Besonderheiten: Nachkommastellen Vorzeichen des Exponenten (optional) Kurzschreibweisen Inkrement ++ und Dekrement -funktionieren (obwohl nicht so intuitiv) auch bei Gleitkommazahlem. Ganzzahliger Exponent Der Operator / steht für Division (nicht ganzzahlig). E Wegen Rundungsfehlern ist Prüfen auf Gleichheit == oder Ungleichheit != meist nicht sinnvoll. Variablen vom Typ float und double können auch Zahlen in gewöhnlicher Punktschreibweise: < vorkommastellen > . < nachkommastellen > zugewiesen werden. 17 / 23 Typumwandlung (Typecast) II 18 Operanden und gemischte Typen I Expliziter Typecast ist wie bei den ganzen Zahlen auch hier und bei allen weiteren Datentypen möglich. Der erlaubte impliziter Typecast zwischen ganzzahligen numerischen Datentypen erweitert sich auf rationale Datentypen wie folgt: Jeder Operator kann nur auf gleichartigen Datentypen arbeiten Operationen und Zuweisungen können trotzdem gemischte Typen enthalten: int i = 1; double d = 2, e; e = i/d; Erlaubt: byte → short → int → long → float → double Dies ist so nur erlaubt, wenn alle beteiligten Typen standardmäß implizit in den gleichen Typ umgewandelt werden (Hier: double). Nicht erlaubt: double 9 float 9 long 9 int 9 short 9 byte Vor der Division i/d wird i automatisch in double umgewandelt. Weitere Typen können erlaubt sein, aber Fehlerquellen beinhalten. 19 / 23 20 Operanden und gemischte Typen II 4.0 Der alphanumerische Datentyp char Zeichenkonstanten (Variablen vom Typ char) können wie folgt Werte zugewiesen werden: Andernfalls muss zusätzlich ein explitizer Typecast auftreten: int i = 1; double d = 2; float f = (float) i/d; Zeichen in einfaches Hochkomma eingeschlossen: char c = ’A’ ASCII-Code des Zeichens: char c = 65 Ausgabe beider Zuweisungen: A Warum Cast (float) notwendig? 1. Bei Berechnung i/d wird i (erlaubterweise) implizit in double umgewandelt. 2. Das Ergebnis der Division ist damit auch automatisch ein double-Wert. 3. Die Zuweisung f=i/d ist daher nicht erlaubt (obwohl 0.5 ohne Probleme als float- Wert darstellbar ist. Manche Zeichen müssen besonders codiert werden, z.B. werden die Zeichen ’, ”oder \ als \’, \”und \\ dargestellt. Weiter gibt es Sonderzeichen wie \n für Zeilenvorschub und \t für ein Tabulatorzeichen. 21 / 23 char vs. String Bisher kennen wir haben wir Zeichenketten in Form des Datentyps String kennen gelernt. Unterschiede: I I I String Zeichenkette, char einzelnes Zeichen. String in “ ”, char in ’ ’ String i. Ggs. zu char kein primitiver Datentyp. Der Datentyp String ist ein zusammengesetzter Datentyp. Ein String besteht aus einem Feld (Array) von char Variablen (später) und besitzt eigene Operatoren. Mehr im Kapitel Ein- und Ausgabe. 23 / 23 22