Kapitel 5: Daten und Operationen Felix Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung Praktische Informatik I im Herbstsemester 2007 Folien nach einer Vorlage von H.-Peter Gumm, Philipps-Universität Marburg Ankündigungen 25.9.2007 Termin Fachprüfung: Termin Wiederholungsprüfung: Freitag, 14. Dezember 2007 Mittwoch, 6. Februar 2008 Zur Übung: Mittwoch, 3. Oktober 2007 keine Übung Hausaufgaben auf Übungsblatt 3 dafür etwas umfangreicher Abgabe der Hausaufgaben in jedem Fall schriftlich Programmieraufgaben auch elektronisch per BlueJ submitter Bearbeiten Sie die Hausaufgaben selbst! Praktische Informatik I, HWS 2007, Kapitel 5 Seite 2 Kommentar zu Kommentaren Denken Sie beim Programmieren an Ihren Tutor Tutor soll das Programm schnell verstehen Tutor kann Java! Daumenregeln Erläutern Sie mittels Javadoc einleitend jedes Feld und jede Methode (Schnittstelle) Erläutern Sie „ungewöhnliche“ oder „schwierige“ Stellen im Programm Was speichert/repräsentiert das Feld? Was macht die Methode? Stellen, über die Sie lange nachgedacht haben Stellen, an denen Sie Fehler gemacht und korrigiert haben Stellen, die Sie beim zweiten Lesen nicht verstanden haben Kommentieren ist sehr stark eine Frage der Erfahrung Praktische Informatik I, HWS 2007, Kapitel 5 Seite 3 Übersicht Bits, Bytes, Binärzahlen, Hex-Zahlen, Dezimalzahlen Konversionen, cast Zufallszahlen Boolesche Werte, Boolesche Algebra Kurzer Exkurs in die Logik Zeichen, Unicode, Fonts Praktische Informatik I, HWS 2007, Kapitel 5 Seite 4 Operationen auf ganzen Zahlen Grundoperationen Zahlkonstanten (Literale) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, … einstellige Operationen +, plus, minus Beispiel: +5, -17, -(3-4) = … zweistellige Operationen +, -, * Addition, Subtraktion, Multiplikation Beispiele: -3 + 17, 5 + -17, 3*(4-7) / Ganzzahl-Division, mathematisch: div) Beispiele: 17/4 = … , -1/-4 = …, -3/2= …, (-3)/2= … % Rest bei Ganzzahl-Division, mathematisch: mod) Beispiele: 17%4 = …, -1%-4 = … , -3%2= … Praktische Informatik I, HWS 2007, Kapitel 5 Seite 5 BlueJ als Java-Taschenrechner Direkteingabe aktivieren Im Calculator rechnen 26/7 = 3 26%7 = 5 etc. Praktische Informatik I, HWS 2007, Kapitel 5 Seite 6 div und mod div : Division ohne Rest mod: Rest bei der Division 23 div 7 = 3 23 mod 7 = 2 Eigenschaften von div und mod Seien n und d natürliche Zahlen, dann gilt: (n div d)*d + (n mod d) = n Sei z = (dk-1dk-2...d1d0)10 die Dezimaldarstellung von z ( k > 0 ): 0 ≤ (n mod d) < d Wichtig ! 0 ≤ di < 10 für i=0,...,(k-1) (dk-1dk-2...d1)10 = z div 10 d0 ´ = z mod 10 Beispiel: 2002 = (2 0 0 2)10 2002 div 10 = 200 = (2 0 0)10 2002 mod 10 = 2 Praktische Informatik I, HWS 2007, Kapitel 5 a hl Z e d i che Unters arstellung re D h i ern f f i d n Z u n lge vo o F s l a Seite 7 Computer verstehen nur 0 und 1 … Eine physikalische Speicherzelle kann nur einen von zwei Zuständen haben Strom/kein Strom, Ladung/keine Ladung, ein/aus, positiv/negativ Interpretiere einen dieser Zustände als 0, den anderen als 1 0 oder 1 Eine Gruppe von Speicherzellen kann viele Kombinationen von Zuständen speichern: Eine Gruppe von zwei Speicherzellen kann 4 Zustände speichern 00, 01, 10, 11 Eine Gruppe von 4 Speicherzellen kann 16 Zustände speichern …1 0000 , 000 ... 1111 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Eine Gruppe von 8 Speicherzellen kann 256 = 28 Zustände speichern: 00 , 01 , 10 , 11 00000000 … 11111111 00000000, 00000001, … 11111110, 11111111 Praktische Informatik I, HWS 2007, Kapitel 5 Seite 8 Byte, Wort, Doppelwort Kein Computer der Welt gibt sich mit einzelnen Speicherzellen ab 16-Bit-Computer rechnen intern mit zwei Byte großen Daten zwei Byte nennt man dann ein Wort Vier Byte heißen ein Doppelwort, 8 Byte ein Quad-Wort 32 Bit Computer rechnen intern mit 4 Byte großen Daten Die kleinste Einheit, mit der Computer rechnen ist ein Byte, das sind 8 Bit Die kleinste Einheit, die ein Computer speichern oder lesen kann ist ein Byte Ob dann 4 Byte ein Wort oder ein Doppelwort heißen, ist uneinheitlich Die kleinste im Speicher adressierbare Einheit kann 1 Byte, 2 Byte aber auch 4 Byte sein 64-Bit Computer … Praktische Informatik I, HWS 2007, Kapitel 5 Seite 9 Können Computer auch Zahlen speichern ? Man kann den Speicherzuständen Zahlen zuordnen Zum Beispiel positive Zahlen oder ganze (positive und negative) Zahlen eine positive Zahl zwischen 0 und 255 d.h. zwischen 0 und 28, oder eine ganze Zahl aus dem Bereich -128 .. +127 , d.h. -27 .. 27-1. In zwei Byte passt 0000 = 0, 0001 = 1, 0010 = 2, 0011 = 3, 0100 = 4, 0101 = 5, 0110 = 6, 0111 = 7, 1000 = -8, 1001 = -7, 1010 = -6, 1011 = -5, 1100 = -4, 1101 = -3, 1110 = -2, 1111 = -1 In einem Byte kann man speichern 0000 = 0, 0001 = 1, 0010 = 2, 0011 = 3, 0100 = 4, 0101 = 5, 0110 = 6, 0111 = 7, 1000 = 8, 1001 = 9, 1010 =10, 1011 = 11, 1100 = 12, 1101 = 13, 1110 = 14, 1111 = 15 eine positive Zahl zwischen 0 und 65535, d.h. zwischen 0 und 216 , oder eine ganze Zahl aus dem Bereich -32768 .. +32767 , d.h. -215 .. 215-1. In 4 Byte passt eine positive Zahl zwischen 0 und 4294967295 d.h. zwischen 0 und 232, oder eine ganze Zahl aus dem Bereich -2147483648 .. +2147483647 , d.h. -231 .. 231-1. Praktische Informatik I, HWS 2007, Kapitel 5 Bitfolge Positive Zahl Ganze Zahl 0000 0 0 0001 1 1 0010 2 2 0011 3 3 0100 4 4 0101 5 5 0110 6 6 0111 7 7 1000 8 -8 1001 9 -7 1010 10 -6 1011 11 -5 1100 12 -4 1101 13 -3 1110 14 -2 1111 15 -1 Seite 10 Wie rechnen Computer? „ganz normal“: 1+0 =1 0+1 =1 1+1 = 0 Übertrag 1 1+1+1 = 1 Übertrag 1 usw. 0011010101010111 + 0101011100110101 = 1000110010001100 Siehe Vorlesung „Praktische Informatik II“ Praktische Informatik I, HWS 2007, Kapitel 5 Seite 11 Woher weiß der Computer, ob eine positive oder eine negative Zahl gemeint ist ? Er weiss es nicht Dank der cleveren Codierung (Zweierkomplement) braucht er es nicht zu wissen Nur der Programmierer muss wissen, was seine Daten bedeuten 0101 Stimmt: 5 + 9 = 14 Praktische Informatik I, HWS 2007, Kapitel 5 + 1001 = 1110 Stimmt: 5 + -7= -2 Seite 12 Binärsystem Binärziffern: 0 und 1 Binärzahl: Folge bnbn-1…b1b0 von Binärziffern Beispiel : (10110111)2 Zahlenwert W = bn*2n+bn-1*2n-1+…+b1*21+b0 10110111 Falls Missverständnis möglich, Index 2 verwenden Beispiel: Beispiel: 10110111 = 27+25+24+22+21+20 = 183 Von Dezimal nach Binär W = (bnbn-1…b1b0 )2 ⇔ W div 2 = (bnbn-1…b1 )2 und W mod 2 = b0 Praktische Informatik I, HWS 2007, Kapitel 5 a hl Z e d i che Unters arstellung re D h i ern f f i d n Z u n lge vo o F s l a Seite 13 Binär - Dezimal Zahlenwert W = bn*2n+bn-1*2n-1+…+b1*21+ b0 = (bn bn-1… b1 b0 )2 W = 2 * (bn*2n-1+bn-1*2n-2+…+b1*20) + b0 = 2 *(bn bn-1… b1 )2 + b0 W div 2 und 0 ≤ b0 < 2 W mod 2 Also von Dezimal nach Binär W = (bnbn-1…b1b0 )2 ⇔ W div 2 = (bnbn-1…b1 )2 und W mod 2 = b0 Praktische Informatik I, HWS 2007, Kapitel 5 Seite 14 Umwandlung ins Binärsystem W = 2* (W div 2) + 2002 1001 500 250 125 62 31 15 7 3 1 = 2 * 1001 = 2 * 500 = 2 * 250 = 2 * 125 = 2 * 62 = 2 * 31 = 2 * 15 =2*7 =2*3 =2*1 =2*0 + + + + + + + + + + + W mod 2 0 1 0 0 1 0 1 1 1 1 1 (2002) (2002)1010==((1111 11 11 11 001100 00 11 0) 0)22 Praktische Informatik I, HWS 2007, Kapitel 5 Seite 15 Hexadezimalsystem Im Hexadezimalsystem verwendet man 16 Ziffern : Positionsbewertungen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F F53CA = F*164+5*163+3*162+C*161+A*160 = (1004490)10 Umrechnung vom Dezimalsystem ins Hexadezimalsystem: (2002)10 = (d2 d1 d0)16 = d2*162+d1*161 + d0*160 = 16*(d2*161+d1*160) + d0, 2002 div 16 2002 mod 16 Konsequenz: 2002 div 16 = 125 = (d2 d1)16 125 div 16 = 7 = (d2)16 wobei 0 ≤ d0 < 16 Ergebnis: ⇒ d0 = 2002 mod 16 = 2 ⇒ d1 = 125 mod 16 = D ⇒ d2 = 7 mod 16 = 7 2002 = (7D2)16 Praktische Informatik I, HWS 2007, Kapitel 5 Seite 16 Darstellung von Bytes Ein Byte wie z.B. 10111110 kann aufgefasst werden als 8-stellige Zahl im Binärsystem 3 stellige Zahl im Oktalsystem (mit führender Oktalziffer < 4) (10111110)2 = 1*27+0*26+1*25+1*24+1*23+1*22+1*21+0*20 (10 111 110)2 = 2*82+7*81+6*80 = (276)8 2-stellige Zahl im Hexadezimalsystem 1011 1110 = 11*161+14*160 = (BE)16 Praktische Informatik I, HWS 2007, Kapitel 5 Seite 17 Ganze Zahlen in Java Java bietet vier Varianten von ganz-zahligen Wertetypen byte short 2 Byte = 16 bit Wertebereich -215 = -32768 … +32767 = 215 -1 int 1 Byte = 8 bit Wertebereich -27 = -128 … +127 = 27 -1 4 Byte = 32 bit Wertebereich -231 = -2147483648 … +2147483647= 231 -1 long 8 Byte = 64 bit Wertebereich -263 … 263-1 , d.h. -9223372036854775808 … 9223372036854775807 Praktische Informatik I, HWS 2007, Kapitel 5 Seite 18 Bereichsfehler Operationen auf Zahlen können den festgelegten Bereich überschreiten z.B. Addition zweier großer positiver Zahlen Im 2-Byte-Bereich 0 .. 216-1 die Addition 50000+50000: 1100001101010000 + 1100001101010000 =11000011010100000 1100001101010000 Was soll das 50000 + 50000 = 34464 ?? + 1100001101010000 = 1000011010100000 1 Übertrag Praktische Informatik I, HWS 2007, Kapitel 5 Stimmt doch : -15536 + -15536 = - 31072 Seite 19 Bereichsüberschreitung Auch bei ganz-zahligen Werten ist Bereichsüberschreitung möglich Beispiel aus dem Bank-Projekt z.B. bei der Addition großer Zahlen, z.B. bei Subtraktion kleiner Zahlen, bei der Multiplikation. Legen Sie ein Konto für “Bill Gates“ an. Zahlen Sie sein Geld ein: 2147483600 €. Überweisen Sie ihm nun das Geld für Ihr Windows-Update: 60 €. Überprüfen Sie mit Inspect, wie viele „Miese“ er jetzt hat. Java speichert int-Werte in 4 Bytes ab Bereich: - 2147483648 ... 2147483647 Für Bereichsüberschreitungen ist der Programmierer verantwortlich Später mehr dazu (auch in der Übung) Praktische Informatik I, HWS 2007, Kapitel 5 Seite 20 Zahlenliterale Zahlenkonstanten (Literale) standardmässig als int interpretiert int-Bereich Interpretation als long durch Anhängen von L oder l -2147483648 … +2147483647 Praktische Informatik I, HWS 2007, Kapitel 5 Seite 21 Konversionen Werte aus einem Bereich können in Werte des anderen konvertiert werden Verknüpfung von Werten aus verschiedenen Bereichen konvertiert automatisch in den größeren engl.: to cast neudeutsch: casten, gecastet, … z.B. (short)+(long) = (long) Konvertierung in zu kleinen Bereich wird ausgeführt auch wenn es nicht passt Fehler Praktische Informatik I, HWS 2007, Kapitel 5 Seite 22 Dezimalzahlen Dezimalzahlen sind Zahlen mit Komma. Man speichert das Vorzeichen die Folge der Ziffern (Mantisse) die Position des Kommas (Exponent) … allerdings im Binären Zahlensystem -7141,59270595 = -0,714159270595*104 Vorzeichen: 1 Mantisse 71415927 Exponent: 4 Praktische Informatik I, HWS 2007, Kapitel 5 Viele Bits für Mantisse: hohe Genauigkeit Viele Bits für Exponenten: großer Bereich Seite 23 Operationen auf Dezimalzahlen Grundoperationen Zahlkonstanten (Literale) Zahlen mit Dezimalpunkt Wissenschaftliche Notation Beispiel: 0.0124, 3.1415, 1234.0, .23 Beispiele: 234E-12 für 2.34*10-12 , 1.5E17 Einstellige Operationen +, - plus, minus Zweistellige Operationen +, -, *, / Addition, Subtraktion, Multiplikation, Division Praktische Informatik I, HWS 2007, Kapitel 5 Seite 24 Java Dezimalzahlen Java hat zwei Varianten von Dezimalzahlen float (floating point number, single precision) 32 Bit double Siehe Vorlesung „Praktische Informatik II“ (double precision) 64 Bit Das genaue Format ist in der IEEE Norm 745 festgelegt: IEEE 745 Sign Exponent Mantisse single 1 bit 8 bit 23 bit Double 1 bit 11 bit 52 bit Praktische Informatik I, HWS 2007, Kapitel 5 Seite 25 Dezimale Literale standardmäßig double float durch Anhängen von F oder f gemischte Operationen konvertieren in größeren Bereich (double) Konversionen, casts (float) (double) Konversion nach (int) schneidet Stellen ab nicht dasselbe wie runden Praktische Informatik I, HWS 2007, Kapitel 5 Seite 26 Fehler bei Dezimalzahlarithmetik Dezimalzahlarithmetik ist nicht exakt Werte werden approximiert Wir addieren 0.1 und 0.2 und erhalten: Vergleiche sind nicht 100% verlässlich: 0.1 + 0.2 ≠ 0.3 Addition ist nicht kommutativ Praktische Informatik I, HWS 2007, Kapitel 5 Seite 27