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