Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen...

16
Programmierkurs Birgit Engels, Anna Schulze ZAIK Universit ¨ at zu K ¨ oln WS 07/08 1 / 62 Kapitel 4 Datentypen und Operatoren Einschub Bin ¨ ardarstellung Ganzzahlige Numerische Datentypen Logischer Datentyp Typumwandlung Rationale numerische Datentypen (Gleitkommazahlen) Der alphanumerische Datentyp char 2 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 werden d ¨ urfen. Damit auch implizit in welchen Anweisungen sie vorkommen kann (sp ¨ ater). 3 / 62 Arten von Datentypen Wir unterscheiden hier wieder Arten von Datentypen: Primitive Datentypen: I Ganzzahlige numerische Datentypen: int, long, ... I Logischer Datentyp: boolean I Rationale numerische Datentypen: float, double, ... I Alphanumerischer Datentyp: char Vordefinierte Datentypen (z.B. : BufferedReader, InputStreamReader) Selbstdefinierte Datentypen (z.B. : Greets, Age) 4

Transcript of Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen...

Page 1: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 2: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 3: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 4: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 5: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 6: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 7: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 8: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 9: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 10: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 11: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 12: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 13: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 14: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 15: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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

Page 16: Programmierkurs - Universität zu Köln · Diese n Bits werden in Java jeweils f ur die ganzen (vorzeichenbehaftete) Zahlen von 2n 1 bis 2n 1 1 verwendet. Die Asymmetrie zwischen

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