Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen...
Transcript of Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen...
Programmierkurs
Birgit Engels, Anna Schulze
ZAIKUniversitat zu Koln
WS 07/08
1 / 62
Kapitel 4
Datentypen und OperatorenEinschub BinardarstellungGanzzahlige Numerische DatentypenLogischer DatentypTypumwandlungRationale numerische Datentypen (Gleitkommazahlen)Der alphanumerische Datentyp char
2 / 62
Datentypen
Bei der Deklaration einer Variablen legt der Datentyp fest:
Welche Werte die Variable annehmen kann.
Wieviel Speicherplatz die Variable belegen darf.
Welche Operationen auf die Variable angewendet werdendurfen.
Damit auch implizit in welchen Anweisungen sie vorkommenkann (spater).
3 / 62
Arten von Datentypen
Wir unterscheiden hier wieder Arten von Datentypen:
Primitive Datentypen:I Ganzzahlige numerische Datentypen: int, long, ...I Logischer Datentyp: booleanI Rationale numerische Datentypen: float, double, ...I Alphanumerischer Datentyp: char
Vordefinierte Datentypen (z.B. : BufferedReader,
InputStreamReader)
Selbstdefinierte Datentypen (z.B. : Greets, Age)
4 / 62
Vor-/Selbstdefinierte Datentypen
Vor-/ Selbstdefinierte Datentypen stehen in engem Zusammenhangmit Objektorientierung und werden daher spater behandelt.
Vorgriff Klasse - Datentyp - Objekt:
Jede (wie bisher gesehen) definierte Klasse XYZ spezifiziert eineneigenen Datentyp XYZ.Es konnen Variablen mit diesem Datentyp als deklariert werden:XYZ beispiel
Solche Variablen sind Objekte vom Typ XYZ und werdenInstanzen der Klasse XYZ genannt.
5 / 62
Primitive Datentypen
Bei sogenannten “primitiven” Datentypen tritt dieObjektorientierung zunachst in den Hintergrund.Sie heissen auch “Standarddatentypen”, da sie von quasi allenProgrammiersprachen mehr oder weniger aquivalent implementiertsind.
Im einfachsten Fall mochte man mit Variablen eines solchenDatentyps ganze oder naturliche Zahlen darstellen.Diese mussen im Computer naturlich binar gespeichert werden.Reserviert ein solcher Datentyp n Bits Speicherplatz, so kann manentweder
die 2n naturlichen Zahlen von 0 bis 2n − 1 oder
die 2n ganzen Zahlen von −2n−1 bis 2n−1 − 1 darstellen.
6 / 62
Naturliche Zahlen: Binarcodierung
Darstellung naturlicher Zahlen mit n Bits:Die Zahlen von 0 bis 2n − 1.Beispiel: n = 3
Dezimal Binar Dezimal Binar Dezimal Binar
0 000 1 001 2 010
3 011 4 100 5 101
6 110 7 111 8 -
8 = 23 ist mit 3 Bits (wegen der Darstellung der 0) nichtmehr darstellbar.
8 ware in Binardarstellung mit 4 Bits: 1000
Das erste Bit entfallt, bei 3-Bit-Darstellung und 000entspricht bereits der Codierung der 0: Uberlauf.
7 / 62
Naturliche Zahlen: Zahlenkreis
Addiere: 111 + 001 = 1000
n = 3 Bits: Hochstes Bit fallt weg:(111 + 001 = 000)bin(7 + 1 = 0)dez
Fehler durch “Uberlauf” !
0
1
2
3
4
5
6
7 000
001
010
011
100
101
110
111
8 / 62
Ganze Zahlen - Vorzeichencodierung
Zur Darstellung von positiven ganzen Zahlen muss nun noch diefur negative hinzu kommen.
1. Moglichkeit: 1. Bit codiert Vorzeichen.Beispiel: n = 3
Dezimal Binar Dezimal Binar
0 000 1 001
2 010 3 011
-0 100 -1 101
-2 110 -3 111
Darstellung ganzer Zahlen von 2n−1 bis 2n−1 − 1.
0 doppelt codiert.
9 / 62
Ganze Zahlen - Einerkomplement
2. Moglichkeit: Einerkomplement(−x ist bitweises Komplement von +x).Beispiel: n = 3
Dezimal Binar Dezimal Binar
0 000 1 001
2 010 3 011
-0 111 -1 110
-2 101 -3 100
Gleicher Darstellungsbereich wie Vorzeichendarstellung
0 doppelt codiert
1. Bit codiert immernoch Vorzeichen.
1. und 2. Moglichkeit: Schwierige Implementierung vonarithmetischen Operationen, da jede Zahl (positiv, negativ) andersinterpretiert werden muss. Daher: Zweierkomplementdarstellung.
10 / 62
Ganze Zahlen - Zweierkomplement
3. Moglichkeit: Zweierkomplement(−x ist bitweises Komplement von +x + 1).Beispiel: n = 3
Dezimal Binar Dezimal Binar
0 000 1 001
2 010 3 011
-1 111 -2 110
-3 101 -4 100
0 nicht mehr doppelt codiert!
Gewonnene “freie” Codierung fur zusatzliche negative Zahl −4
−4 statt +4 : 1. Bit codiert immernoch Vorzeichen.
11 / 62
Ganze Zahlen: Zahlenkreis im Zweierkomplement
Zweierkomplement formal definiert:
Hochstwertiges Bit bn hat Wertigkeit −1
Alle anderen Bits bi 1, d.h.
x = −bn ∗ 2n + bn−1 ∗ 2n−1 + · · · + b0
Beispiel:110 = −1 ∗ 22 + 1 ∗ 21 + 0 ∗ 20 = −4 + 2 + 0 = −2
0
1
2
3
-4
-3
-2
-1 000
001
010
011
100
101
110
111
12 / 62
4.2 Ganzzahlige numerische Datentypen
Typ Anz Bits Min Maxbyte 8 -128 127short 16 -32768 32767int 32 -2147483648 2147483647long 64 < −1018 > 1018
Wir sehen, dass fur Standarddatentypenn = 8 < 16 < 32 < 64 < . . . ist.
Diese n Bits werden in Java jeweils fur die ganzen(vorzeichenbehaftete) Zahlen von −2n−1 bis 2n−1 − 1 verwendet.
Die Asymmetrie zwischen kleinster und großter darstellbarer Zahleines Typs wird durch die Darstellung der “0” bedingt.
13 / 62
Gultiger Zahlenbereich (Over-/Underflow)
Werden die Grenzen (min./max. darstellbare Zahl) des gultigenZahlenbereichs eines Datentyps z.B. durch Zuweisung einer zugroßen oder zu kleinen Zahl zu einer Variable des Typs verletztentsteht ein sogenannter Uber-/Unterlauf bzw. Over-/Underflow(Vorstellung: Bitdarstellung als Kreis → Ubung):
Overflow: Bitdarstellung einer zu großen Zahl erfordertmehr Bits als verfugbar.Bits werden abgeschnitten: Darstellungentspricht kleinerer Zahl.Bitdarstellung wird auch als kleinere Zahl (meistsogar wegen Darstellung als negative Zahl!)interpretiert.
Underflow: Analog mit zu kleiner Zahl.
14 / 62
Operanden fur ganze Zahlen I - Arithmetische Operationen
Operator Beispiel Bedeutung+ +i Vorzeichen (kann weggelassen werden)- -i Vorzeichen+ a+b Summe- a-b Differenz* a*b Produkt/ a/b ganzzahlige Division% a%b Rest der ganzzahligen Division (Modulo)= x=a+b Zuweisung
Diese Operatoren ermoglichen eine Art von Anweisung:Die Zuweisung arithmetischer Ausdrucke.
15 / 62
Kurzschreibweisen
Fur haufig benutzte Ausdrucke existieren Kurzschreibweisen:
Inkrementierung/Dekrementierung:
int i=0;
i = i + 1;
i= i - 1;
entspricht:
int i=0;
i++;
i--;
Selbsbezugliche Addition/Subtraktion/... mit beliebigem 2.Wert:
Operator Beispiel Bedeutung+= a+=b a=a+b
-= a-=b a=a-b
*= a*=b a=a*b
/= a/=b a=a/b
%= a%=b a=a%b
16 / 62
Ganzzahlige Operanden: IntOps.java
1. public static void main(String[] args)
2. {
3. int a=1, b=3, c=5, d=10;
4. System.out.println( a + ‘‘ ’’ + b +
‘‘ ’’ + c + ‘‘ ’’ + d );
5. a++;
6. b+=a;
7. d=d/c;
8. a=b%d;
9. System.out.println( a + ‘‘ ’’ + (b-a) );
10. }
1 3 5 101 4
17 / 62
Ganzzahlige Operanden: IntOps.java
1. public static void main(String[] args)
2. {
3. int a=1, b=3, c=5, d=10;
4. System.out.println( a + ‘‘ ’’ + b +
‘‘ ’’ + c + ‘‘ ’’ + d );
5. a++;
6. b+=a;
7. d=d/c;
8. a=b%d;
9. System.out.println( a + ‘‘ ’’ + (b-a) );
10. }
1 3 5 101 4
Der Wert b-a wird berechnetund auf dem Bildschirm ausge-geben, aber nicht gespeichert.
18 / 62
Ganzzahlige Operanden: IntOps.java
1. public static void main(String[] args)
2. {
3. int a=1, b=3, c=5, d=10;
4. System.out.println( a + ‘‘ ’’ + b +
‘‘ ’’ + c + ‘‘ ’’ + d );
5. a++;
6. b+=a;
7. d=d/c;
8. a=b%d;
9. System.out.println( a + ‘‘ ’’ + (b-a) );
10. }
1 3 5 101 4
Merke: Kurze, gleichartigekombinierte Deklarationen undInitialisierungen zusammenfas-sen.
19 / 62
Ganzzahlige Operanden: IntOps.java
1. public static void main(String[] args)
2. {
3. int a=1, b=3, c=5, d=10;
4. System.out.println( a + ‘‘ ’’ + b +
‘‘ ’’ + c + ‘‘ ’’ + d );
5. a++;
6. b+=a;
7. d=d/c;
8. a=b%d;
9. System.out.println( a + ‘‘ ’’ + (b-a) );
10. }
1 3 5 101 4
Merke: Ausgabe von Variablen mitSystem.out.println(var) ohne “ ”.und Zusammensetzen von Ausgaben mitSystem.out.println(var + ‘‘ ’’)
20 / 62
Kurzschreibweisen II
Fur die Inkrementierung/Dekrementierung existieren weitereKurzschreibweisen:
int i=0;
++i;
--i;
entsprichtnicht:
int i=0;
i++;
i--;
Dies ist wichtig, falls die Inkrementierung/Dkrementierunginnerhalb komplexerer Anweisungen ausgefuhrt werden: Im ErstenFall wird zuerst In-/Dekrementiert und dann der (neue) Wert voni weiterverwendet, im zweiten Fall wird zuerst der alte Wert von i
verwendet und dann In-/Dekrementiert.
21 / 62
Inkrement/Dekrement: InkDekOps.java
1. public static void main(String[] args)
2. {
3. int a=1, b=1;
4. System.out.println( ‘‘a: ’’ + a++ );
5. System.out.println( a );
6. System.out.println( ‘‘b: ’’ + ++b );
7. }
122
22 / 62
Inkrement/Dekrement: InkDekOps.java
1. public static void main(String[] args)
2. {
3. int a=1, b=1;
4. System.out.println( ‘‘a: ’’ + a++ );
5. System.out.println( a );
6. System.out.println( ‘‘b: ’’ + ++b );
7. }
122
Der Wert von a wird zu-erst ausgegeben, dann inkre-mentiert (vgl. 2. Ausgabe vona).
23 / 62
Inkrement/Dekrement: InkDekOps.java
1. public static void main(String[] args)
2. {
3. int a=1, b=1;
4. System.out.println( ‘‘a: ’’ + a++ );
5. System.out.println( a );
6. System.out.println( ‘‘b: ’’ + ++b );
7. }
122
Der Wert von b wird noch vorder Ausgabe inkrementiert.
24 / 62
Operanden fur ganze Zahlen II - Vergleichsoperationen
Operator Beispiel Bedeutung</<= a<b/a<=b Liefert wahr, falls a kleiner(-gleich) b>/>= a>b/a>=b Liefert wahr, falls a grosser(-gleich) b!= a!=b Liefert wahr, falls a ungleich b ist== a==b Liefert wahr, falls a gleich b ist= x=a<b Zuweisung
Die Auswertung von Vergleichsoperationen liefert einen derlogischen Werte wahr oder falsch.Die Zuweisung eines solchen Wertes erfordert links von = eineVariable des Typs boolean !.
25 / 62
4.3 Logischer Datentyp boolean
Java besitzt den logischen Datentyp boolean :
Wertebereich: { true, false }
Kann bei Zuweisungen von logischen Ausdrucken verwendetwerden.
Wird implizit bei Kontrollstrukturen verwendet.
Logische Operatoren:
Operator Beispiel Bedeutung
! !i logische Negation&& a && b logisches UND|| a || b logisches ODER= a = a && b Zuweisung
26 / 62
Vergleichsoperanden: CompOps.java
1. public static void main(String[] args)
throws IOException
2. {
3. int zahl;
4. boolean zwischen1und10;
5. System.out.println( ‘‘Ganze Zahl:’’ );
6. {... Einlese-Anweisungen ... }
7. zahl = Integer.parseInt(zahlString);
8. zwischen1und10 = (zahl>=0) && (zahl<=10);
9. System.out.println( ‘‘Die Zahl liegt zwischen 0
und 10: ’’
+ zwischen1und10 );
10. }//main
27 / 62
Vergleichsoperanden: CompOps.java
1. public static void main(String[] args)
throws IOException
2. {
3. int zahl;
4. boolean zwischen1und10;
5. System.out.println( ‘‘Ganze Zahl:’’ );
6. {... Einlese-Anweisungen ... }
7. zahl = Integer.parseInt(zahlString);
8. zwischen1und10 = (zahl>=0) && (zahl<=10);
9. System.out.println( ‘‘Die Zahl liegt zwischen 0
und 10: ’’
+ zwischen1und10 );
10. }//mainVergleich auf Variablen vomTyp int.
28 / 62
Vergleichsoperanden: CompOps.java
1. public static void main(String[] args)
throws IOException
2. {
3. int zahl;
4. boolean zwischen1und10;
5. System.out.println( ‘‘Ganze Zahl:’’ );
6. {... Einlese-Anweisungen ... }
7. zahl = Integer.parseInt(zahlString);
8. zwischen1und10 = (zahl>=0) && (zahl<=10);
9. System.out.println( ‘‘Die Zahl liegt zwischen 0
und 10: ’’
+ zwischen1und10 );
10. }//mainWird zu Typ boolean ausge-wertet!
29 / 62
Vergleichsoperanden: CompOps.java
1. public static void main(String[] args)
throws IOException
2. {
3. int zahl;
4. boolean zwischen1und10;
5. System.out.println( ‘‘Ganze Zahl:’’ );
6. {... Einlese-Anweisungen ... }
7. zahl = Integer.parseInt(zahlString);
8. zwischen1und10 = (zahl>=0) && (zahl<=10);
9. System.out.println( ‘‘Die Zahl liegt zwischen 0
und 10: ’’
+ zwischen1und10 );
10. }//mainKonnen logisch weiter ver-knupft werden.
30 / 62
Verwechslungsgefahr
Operator Beispiel Bedeutung== a==b Liefert wahr, falls a gleich b ist= x=a<b Zuweisung
Durch Tippfehler wird der Vergleichsoperator fur den Test aufGleichheit zweier Variablen == leicht zum Zuweisungsperator = undumgekehrt !!!
31 / 62
4 Ganzzahlige Datentypen vs. 1 int
Haben byte, short, int, long kennen gelernt.
Nutzen in Beispielen nur int, da dieser Typ auch in der Praxis amgebrauchlichsten ist.
Nutzung von byte, short :
Speicherplatz sparen (bei Speicherkritischen Geraten, z.B.Handys, oder grossen Eingaben fur Algorithmen).
Falls keine “normalen” Zahlen dargestellt werden sollen,sondern spezielle Dinge kodiert werden (z.B. UberschaubareAnzahl von Zustanden, Farben, ...).
Nutzung von long, falls Wertebereich von int nicht ausreicht.
32 / 62
4.4 Typumwandlung (Typecast) I
Java ist eine strikt typisierte Sprache, d.h. jede Variable besitzteinen Typ. Dieser wird vom Compiler bei der Variablendeklaration“gelernt” und “erlaubt” danach nur:
Zuweisungen von Variablen des gleichen Datentyps.
Operationen, die fur den Typ der Variablen definiert sind.
Operationen auf Variablen gleichen Typs.
Manchmal ist es dennoch notig (und sinnvoll!), andereZuweisungen bzw. Operationen auszufuhren, daher gibt es 2 Artenvon Typumwandlung (Typecast):
Expliziter Typecast
Impliziter Typecast
33 / 62
Expliziter Typecast
Explizite Typumwandlung: Einer Variable wird explizit der NeueTyp in Klammern vorangestellt:
short s=123;
int i;
i= (int) s;
Normale Deklaration.Normale Deklaration.Zuweisung mit explizitem Castvon short auf int
Achtung: Der Typecast (kurz: Cast) andert nicht den deklariertenTyp der Variable, sondern ermoglicht nur die Zuweisung zu einerVariable anderen Typs bzw. die Anwendung einer Operationanderen Typs. Variable s ist immernoch vom Typ short und i
vom Typ int !
34 / 62
Impliziter Typecast
Implizite Typumwandlung: Eine Variable wird einer anderen vonanderem, erlaubten Typ zugewiesen oder eineOperation eines solchen Typs auf sie angwandt:
short s=123;
int i;
i= s;
Normale Deklaration.Normale Deklaration.Zuweisung von short zu int
Der Typecast andert auch hier nicht den deklarierten Typ derVariable !Variable s ist immernoch vom Typ short und i vom Typint !
35 / 62
Impliziter Typecast - Erlaubte Typen
Fur einige Datentypen gibt es Typen, auf die ein impliziter Casterlaubt ist, d.h. bei typgemischten Zuweisungen oder Operationenwird vom Compiler jede Variable automatisch in einen derbeteiligten Typen umgewandelt. Dieser ist fest definiert.
Beispiel byte, short, int, long:
Cast wie folgt erlaubt, da Wertebereich sich vergrossert:
byte → short → int → long
Cast wie folgt verboten, da Wertebereich sich verkleinert(Gefahr von Over-/Underflow):
long 9 int 9 short 9 byte
36 / 62
Warnung
Impliziter Cast:I Auf nicht erlaubte Typen erzeugt Kompilierfehler.I Auf erlaubte Typen kann ungewollt sein und fehlerhafte Effekte
erzeugen (Beispiele spater)!I Typen konnen erlaubt sein, aber nur in sehr speziellen Fallen
oder trickreicher Programmierung sinnvoll sein!
Expliziter Cast:Compiler lasst auch Unsinniges zu.
Die Sicherheit eines Typecasts muss der Programmiererverantworten !
37 / 62
Beispiel Typecast (IntCast.java)
1. public static void main(String[] args)
2. {
3. byte b;
4. short s=255;
5. int i=123456;
6. long l;
7. b = (byte) s ;
8. l = i ;
9. System.out.println( ‘‘Byte: ’’ + b + ‘‘ Short:
’’ + s );
10. System.out.println( ‘‘Int: ’’ + i + ‘‘ Long: ’’
+ l );
11. }
Byte: -1 Short: 255Int: 123456 Long: 123456
38 / 62
Beispiel Typecast (IntCast.java)
1. public static void main(String[] args)
2. {
3. byte b;
4. short s=255;
5. int i=123456;
6. long l;
7. b = (byte) s ;
8. l = i ;
9. System.out.println( ‘‘Byte: ’’ + b + ‘‘ Short:
’’ + s );
10. System.out.println( ‘‘Int: ’’ + i + ‘‘ Long: ’’
+ l );
11. }
Byte: -1 Short: 255Int: 123456 Long: 123456
Expliziter Cast erforder-lich, da nicht sicher.
Resultiert in Overflow furByte-Variable.
39 / 62
Beispiel Typecast (IntCast.java)
1. public static void main(String[] args)
2. {
3. byte b;
4. short s=255;
5. int i=123456;
6. long l;
7. b = (byte) s ;
8. l = i ;
9. System.out.println( ‘‘Byte: ’’ + b + ‘‘ Short:
’’ + s );
10. System.out.println( ‘‘Int: ’’ + i + ‘‘ Long: ’’
+ l );
11. }
Byte: -1 Short: 255Int: 123456 Long: 123456
Impliziter Cast, da sicher.
Wert bleibt gleich inLong-Variable.
40 / 62
4.5 Gleitkommazahlen
Wie bereits am Beispiel einer Konstanten
static final double PI=3.1415;
gesehen, benotigen wir neben ganzen Zahlen naturlich auchrationale Zahlen.
Jede Zahl x ∈ Q, x 6= 0 lasst sich schreiben als:
x = s · m · 10e
mit- Vorzeichen s ∈ {1,−1}- Mantisse m ∈ Q, 1 ≤ m < 10- Exponent e ∈ Z.
Da sich in ausgeschriebener Variante, die Position des Kommas jenach Exponent verandern wurde, heisst diese DarstellungGleikommazahl (Floating Point Number).
41 / 62
Rationale Numerische Datentypen (Gleitkommazahlen)
Im Computer wird eine rationale Zahl immer als Gleitkommazahldurch Vorzeichen, Mantisse und Exponent (zur Basis 2)reprasentiert.
In Java gibt es fur Gleitkommazahlen die 2 Typen float (FloatingPoint Number) und double (Double Precission):
Bitanzahl fur: float double
Vorzeichen 1 1Mantisse 23 52Exponent 8 11
Summe 32 64
Bereich 1.4E − 45 − 3.4E38 4.9E − 324 − 1.8E308
42 / 62
Notation fur Gleitkommazahlen
Die Darstellung einer Gleitkommazahl im Java-Quelltext hat dieForm:
Vorzeichen (optional)
Vorkommastellen
Dezimalpunkt
Nachkommastellen
E
Vorzeichen des Exponenten (optional)
Ganzzahliger Exponent
Variablen vom Typ float und double konnen auch Zahlen ingewohnlicher Punktschreibweise:
< vorkommastellen > . < nachkommastellen >
zugewiesen werden.
43 / 62
Vor- und Nachteile von Gleitkommazahlen
Vorteile von Gleitkommazahlen:
Der abgedeckte Zahlenbereich ist sehr gross.
Erlaubt dennoch hohe Prazision.
Nachteile von Gleitkommazahlen:
Bei Rechenoperationen entstehen in der Regel (wie bei denmeisten reellen Rechnungen im Computer) Rundungsfehler.
Die Rechenoperationen, insbesondere Addition undSubtraktion, sind erheblich aufwandiger.
44 / 62
Operanden fur Gleitkommazahlen
Operanden fur Gleitkommazahlen entsprechen den arithmetischenund vergleichenden Operanden fur ganze Zahlen.
Einige Besonderheiten:
Kurzschreibweisen Inkrement ++ und Dekrement --funktionieren (obwohl nicht so intuitiv) auch beiGleitkommazahlem.
Der Operator / steht fur Division (nicht ganzzahlig).
Wegen Rundungsfehlern ist Prufen auf Gleichheit ==
oder Ungleichheit != meist nicht sinnvoll.
45 / 62
Prioritaten der Java Operanden
Fur die Beschreibung komplizierterer Ausdrucke (besonders ohneBruchschreibweise), empfiehlt sich die Kenntnis der Prioritatenunter den Operanden.
Wollte Prioritatentabelle angeben, fand statt dessen:
46 / 62
Prioritaten der Java Operanden
Fur die Beschreibung komplizierterer Ausdrucke (besonders ohneBruchschreibweise), empfiehlt sich die Kenntnis der Prioritatenunter den Operanden.
Wollte Prioritatentabelle angeben, fand statt dessen:
Kein Programmierer sucht nach seiner
Prazedenz-Tabelle, um die Ausfuhrungsreihenfolge von
Operatoren zu uberprufen.
Setzen Sie einfach Klammern, wenn Sie nicht sicher sind,
und fertig.
47 / 62
Grundregeln
Der Zugriffsoperator . hat großte Prioritat.
Klammern haben zweithochste Prioritat und konnen jedemAusdruck die gewunschte Prioritat einraumen.
Es gilt Punkt- vor Strichrechnung.
Gerade komplizierte Ausdrucke werden mit Klammerung leserlicher.
Bei Unsicherheit immer Klammern.
48 / 62
Beispiel Rundungsfehler (FloatErr.java)
1. public static void main(String[] args)
2. {
3. float f1=1.234567E-7f, f2=1, f3=-f2;
4. float sum1,sum2;
5. sum1=(f1+f2)+f3;
6. sum2=f1+(f2+f3);
7. System.out.println( ‘‘(f1+f2)+f3: ’’ + sum1 );
8. System.out.println( ’’f1+(f2+f3): ‘‘ + sum2 );
9. }
(f1+f2)+f3: 1.1920929E-7f1+(f2+f3): 1.234567E-7
49 / 62
Beispiel Rundungsfehler (FloatErr.java)
1. public static void main(String[] args)
2. {
3. float f1=1.234567E-7f, f2=1, f3=-f2;
4. float sum1,sum2;
5. sum1=(f1+f2)+f3;
6. sum2=f1+(f2+f3);
7. System.out.println( ‘‘(f1+f2)+f3: ’’ + sum1 );
8. System.out.println( ’’f1+(f2+f3): ‘‘ + sum2 );
9. }
(f1+f2)+f3: 1.1920929E-7f1+(f2+f3): 1.234567E-7
(f1+f2)+f3 : Zu eine kleinen Zahlwird 1 addiert, dann wieder abgezo-gen: Prazisionsverlust
50 / 62
Beispiel Rundungsfehler (FloatErr.java)
1. public static void main(String[] args)
2. {
3. float f1=1.234567E-7f, f2=1, f3=-f2;
4. float sum1,sum2;
5. sum1=(f1+f2)+f3;
6. sum2=f1+(f2+f3);
7. System.out.println( ‘‘(f1+f2)+f3: ’’ + sum1 );
8. System.out.println( ’’f1+(f2+f3): ‘‘ + sum2 );
9. }
(f1+f2)+f3: 1.1920929E-7f1+(f2+f3): 1.234567E-7
f1+(f2+f3) : +1 und -1 werden zu-erst addiert und ergeben exakt 0. Eswird quasi keine Addition auf f1 aus-gefuhrt: Kein Prazisionsverlust
51 / 62
float Zuweisung
Bei Zuweisung einer moglicherweise zu grossen/prazisen Konstantezu einer, gibt es (nur hier!) 2 Moglichkeiten des expliziten Casts:
float f =
1676158.43141ffloat f = (float)1676158.43141
Ohne eine dieser Varianten wurde die Zahl als double interpretiertund ein Kompilierfehler ausgegeben.
52 / 62
Typumwandlung (Typecast) II
Expliziter Typecast ist wie bei den ganzen Zahlen auch hier undbei allen weiteren Datentypen moglich.Der erlaubte impliziter Typecast zwischen ganzzahligennumerischen Datentypen erweitert sich auf rationale Datentypenwie folgt:
Erlaubt:byte → short → int → long → float → double
Nicht erlaubt:double 9 float 9 long 9 int 9 short 9 byte
Weitere Typen konnen erlaubt sein, aber Fehlerquellen beinhalten.
53 / 62
Operanden und gemischte Typen I
Jeder Operator kann nur auf gleichartigen Datentypen arbeiten
Operationen und Zuweisungen konnen trotzdem gemischteTypen enthalten:
int i = 1;double d = 2, e;e = i/d;
Dies ist so nur erlaubt, wenn alle beteiligten Typenstandardmaß implizit in den gleichen Typ umgewandeltwerden (Hier: double).
Vor der Division i/d wird i automatisch in double
umgewandelt.
54 / 62
Operanden und gemischte Typen II
Andernfalls muss zusatzlich ein explitizer Typecast auftreten:
int i = 1;double d = 2;float f = (float) i/d;
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.
55 / 62
Abrunden mit int-Cast
Durch explizite Umwandlung von Gleitkommazahlen (double,float) in ganzzahlige Werte erhalt man den ganzzahligen Anteilder Zahl:
Das Programmfragment:
double d = 3.1415;int i = (int) d;System.out.prinln(d);
Gibt aus:
3
Bei gemischten Zuweisungen konnen unerwunschte impliziteUmwandlungen in int auftreten, die ebenfalls diesen Effekthaben...
56 / 62
Beispiel gemischte Typen (MixedType.java
1. public static void main(String[] args)
2. {
3. int i = 1;
4. double d = 2, e, a, b;
5. e = i/d;
6. float f= (float) (i/d);
7. a = i/2 ;
8. b = i/2.0 ;
9. System.out.println( ’’e: ‘‘ + e + ’’ f: ‘‘ +
f);
10. System.out.println( ’’a: ‘‘ + a + ’’ b: ‘‘ +
b);
11. }
e: 0.5 f: 0.5a: 0.0 b: 0.5
57 / 62
Beispiel gemischte Typen (MixedType.java
1. public static void main(String[] args)
2. {
3. int i = 1;
4. double d = 2, e, a, b;
5. e = i/d;
6. float f= (float) (i/d);
7. a = i/2 ;
8. b = i/2.0 ;
9. System.out.println( ’’e: ‘‘ + e + ’’ f: ‘‘ +
f);
10. System.out.println( ’’a: ‘‘ + a + ’’ b: ‘‘ +
b);
11. }
e: 0.5 f: 0.5a: 0.0 b: 0.5
2 wird als int interpretiert: / alsganzzahlige Division ergibt 0 und wirdimplizit in double umgewandelt.
58 / 62
Beispiel gemischte Typen (MixedType.java
1. public static void main(String[] args)
2. {
3. int i = 1;
4. double d = 2, e, a, b;
5. e = i/d;
6. float f= (float) (i/d);
7. a = i/2 ;
8. b = i/2.0 ;
9. System.out.println( ’’e: ‘‘ + e + ’’ f: ‘‘ +
f);
10. System.out.println( ’’a: ‘‘ + a + ’’ b: ‘‘ +
b);
11. }
e: 0.5 f: 0.5a: 0.0 b: 0.5
2.0 wird als double interpretiert: iwird implizit in double umgewandelt,so dass / als rationale Division 0.5 alsdouble-Wert ergibt.
59 / 62
4.6 Der alphanumerische Datentyp char
char-Variablen werden dazu verwendet, Zeichen darzustellen.Zeichen sind hier: Buchstaben, Ziffern, Sonderzeichen ...
Typischerweise sind chars 1 Byte groß und konnen daher 256verschiedene Werte reprasentieren. Dabei entsprechen dieersten 128 Zeichen den Zeichen der ASCII-Tabelle (s.o.). Dienachsten 128 Zeichen sind Landerspezifischen Erweiterungenvorbehalten.
Java verwendet einen 2 Byte langen char-Typen, der die65536 des Unicode umfasst. So konnen quasi alle bis heutebekannten Schriftzeichen anhand einer EindeutigenUnicode-Nummer dargestellt werden.
60 / 62
Nutzung von char
Zeichenkonstanten (Variablen vom Typ char) konnen wie folgtWerte zugewiesen werden:
Zeichen in einfaches Hochkomma eingeschlossen:
char c = ’A’
ASCII-Code des Zeichens:
char c = 65
Ausgabe beider Zuweisungen: A
Manche Zeichen mussen besonders codiert werden, z.B.werden die Zeichen ’, ”oder \ als \’, \”und \\ dargestellt.
Weiter gibt es Sonderzeichen wie \n fur Zeilenvorschub und\t fur ein Tabulatorzeichen.
61 / 62
char vs. String
Bisher kennen wir haben wir Zeichenketten in Form desDatentyps String kennen gelernt.Unterschiede:
I String Zeichenkette, char einzelnes Zeichen.I String in “ ”, char in ’ ’I 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 (spater) und besitzt eigene Operatoren.
Mehr im Kapitel Ein- und Ausgabe.
62 / 62