Programmiertechnik Skalare Typen,Variablen, Zuweisungen int i; long j; boolean isEmpty; double average; char naechstesZeichen; Prof. Dr. Oliver Haase j = 42L; i = (int) j; isEmpty = true; average = 37.266; naechstesZeichen = 'h'; Oliver Haase Hochschule Konstanz 1 Zahlensysteme Problem: Wie stellt man (große) Zahlen einfach, platzsparend und rechnergeeignet dar? Abzählen II, IIII, IIIIII, IIIIIIIIIIII auf Anhieb kann ein Mensch höchstens die Zahl 4 sicher erkennen zeit- und platzaufwendig für große Zahlen Strichlisten II, IIII, IIII I, IIII IIII II leichter zu erkennen zeit- und platzaufwendig für große Zahlen Oliver Haase Hochschule Konstanz 2 Römische Zahlen Römische Zahlen Symbole für 1: I 10: X 100: C 1000: M 5: V 50: L 500: D Wertigkeit ergibt sich durch Reihenfolge der Symbole kleine Zahl links von großer Zahl minus kleine Zahl rechts von großer Zahl plus höchstens 3 gleiche Symbole nebeneinander Oliver Haase Hochschule Konstanz 3 Römische Zahlen Römische Zahlen Beispiele: VI IIX MCMLXXXVIII relativ kompakte Darstellung kompliziert! Oliver Haase Hochschule Konstanz 4 Dezimalsystem Dezimalsystem das Dezimalsystem ist ein Stellenwertsystem Wert einer Ziffer hängt davon ab, an welcher Stelle sie in der Zahl steht 5582 = 5 · 1000 + 5 · 100 + 8 · 10 + 2 · 1 = 5 · 103 + 5 · 102 + 8 · 101 + 2 · 100 Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Basis: 10 Stellenwerte: 1, 10, 100, 1000 (10i für die i-te Stelle von rechts) kompakte, einfache Darstellung selbst großer Zahlen einfaches Rechnen möglich Oliver Haase Hochschule Konstanz 5 Stellenwertsysteme Stellenwertsysteme sind mit beliebiger Basis b ≥ 2 möglich z3 z2 z1 z0 = z3 · b3 + z2 · b2 + z1 · b1 + z0 · b0 Basis: b Ziffern: 0, 1, 2, …, b -1 Stellenwerte: 1, b1 , b2 , b3 , … Beim Programmieren übliche Stellenwertsysteme: System Basis Ziffern Stellenwerte Binär (Dual) 2 0,1 1,2,4,8,16,… Oktal 8 0,1,2,3,4,5,6,7 1,8,64,512,… Dezimal 10 0,1,2,3,4,5,6,7,8,9 1,10,100,1000,… Hexadezimal 16 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 1,16,256,4096 Oliver Haase Hochschule Konstanz 6 Binärsystem (2-er System) Rechner stellen Zahlen im Binärsystem dar, weil sich die beiden Ziffern 0, 1 gut darstellen lassen: Ziffer 1: Strom an / Kondensator geladen Ziffer 0: Strom aus / Kondensator entladen Beispiel: 10101110011102 Oliver Haase Hochschule Konstanz 7 Vorzeichendarstellung ein Bit wird zur Darstellung des Vorzeichens benötigt. restliche Bits zur Darstellung des Betrags der Zahl negative Zahl Betrag wird dargestellt als sogenanntes Zweierkomplement Mehr dazu in Hardwaresysteme (HaSy) Bei einer Zahlendarstellung mit n Bits stehen (n -1) Bits für die Betragsdarstellung zur Verfügung Wertebereich circa [-2n-1; 2n-1] Oliver Haase Hochschule Konstanz 8 Java Ganzzahltypen Ganze Zahlen heißen auf englisch und in Programmiersprachen Integers Java definiert 4 verschiedene Integertypen, deren Länge und damit auch Wertebereich fest definiert sind. Darstellung: 2-er Komplement mit Vorzeichen Typ Länge kleinste darstellbare Zahl größte darstellbare Zahl byte 8 Bit -128 127 -32‘768 32‘767 short 16 Bit int 32 Bit -2‘147‘483‘648 2‘147‘483‘647 long 64 Bit -9‘223‘372‘036‘854‘775‘808 9‘223‘372‘036‘854‘775‘807 Oliver Haase Hochschule Konstanz 9 Gleitkommazahlen Computer stellen gebrochene oder sehr große (sehr kleine) Zahlen als Binärzahlenpaar mit Gleitkomma dar: Mantisse · 2Exponent Die Details sind rechnerabhängig Weit verbreitet Standard IEEE 754 (Institute of Electrical and Electronics Engineers) Details siehe Vorlesung Hardwaresysteme (Hasy) Java definiert 2 verschiedene Gleitkommazahlentypen: float: 32-Bit Gleitkommazahl nach IEEE 754 double: 64-Bit (double precision) Gleitkommazahl nach IEEE 754 Oliver Haase Hochschule Konstanz 10 Gleitkommazahlen Wertebereich z.B. 32-Bit-Gleitkommazahl (float) größte darstellbare Zahl: ~2 · 2127 = 2128 ≈ 3,4 · 1038 kleinste darstellbare Zahl: ~ (-2) · 2127 = -2128 ≈ -3,4 · 1038 wesentlich größerer Wertebereich als long !!! Aber: Die größte Zahl hat 128 Binärstellen (39 Dezimalstellen), von denen nur die ersten 24 Binärstellen (7 Dezimalstellen) dargestellt werden! Gleitkommazahlen sind ungenau!!! Oliver Haase Hochschule Konstanz 11 Nichtnumerische Daten Codierung: Für jede Art von Daten jeweils alle vorkommenden Werte auflisten und durchnummerieren Der Rechner verwendet die Nummern statt der Werte Beispiele: Zeichencodes: durchnummerierte Liste von Buchstaben, Ziffern, Sonderzeichen (z.B. @, ~, §, !) und Steuerzeichen (z.B. Zeilenvorschub) Befehlscodes: durchnummerierte Liste von Maschinenbefehlen Farbtabelle: durchnummerierte Liste der am Bildschirm darstellbaren Farben Oliver Haase Hochschule Konstanz 12 Zeichencodes ASCII American Standard Code for Information Interchange 7-Bit Code mit den wichtigsten internationalen Zeichen Normen: ISO/IEC 646, DIN 6603 Latin 1 und 2 8-Bit Code, erweitert ASCII z.B. um Umlaute Normen: ISO/IEC 8859, DIN 6603 EBCDIC Extended Binary Coded Decimal Interchange Code 8-Bit Code, üblich auf IBM Großrechnern Unicode 16-Bit Code, erlaubt die Darstellung von 65‘536 Zeichen verwendet z.B. in Java und XML ermöglicht die Verwendung internationaler Alphabete Oliver Haase Hochschule Konstanz 13 Java Zeichen Die englische Bezeichnung characters (chars) ist auch im Deutschen geläufiger Java verwendet 16-bit Unicode characters Syntax: char Characters können auch als 2 Byte lange, vorzeichenlose Ganzzahlen verwendet werden Oliver Haase Hochschule Konstanz 14 Java Booleans Booleans sind logische ("boolsche") Werte. Sie können den Wahrheitswert wahr oder falsch annehmen, und sie können logisch miteinander verknüpft werden (A oder B, A und B, nicht A). Syntax in Java: boolean, mit den möglichen Werten true oder false. Im Speicher dargestellt als 4-Byte int, von dem nur 1 Bit verwendet wird speicherineffizient 32 Bit belegt, 1 Bit verwendet einfach, schnell, da Prozessoren auf wortgroße Daten optimiert sind Oliver Haase Hochschule Konstanz 15 Überblick: Java skalare Typen Typ Format, mögliche Werte byte 8-Bit-Ganzzahl in 2-er Komplementdarstellung short 16-Bit-Ganzzahl in 2-er Komplementdarstellung int 32-Bit-Ganzzahl in 2-er Komplementdarstellung long 64-Bit-Ganzzahl in 2-er Komplementdarstellung float 32-Bit-Gleitkommazahl nach IEEE 754 double 64-Bit-Gleitkommazahl nach IEEE 754 char 16-Bit-Unicode-Zeichen boolean true, false Oliver Haase Hochschule Konstanz 16 Variablen Variablen sind benannte und typisierte Speicherportionen, die Werte des angegebenen Typs enthalten können. Variablen müssen vor ihrer Benutzung deklariert werden, etwa: int i; boolean isEmpty; double average; short index1; char naechstesZeichen; Merke: Erst Typ, dann Name! Java Namenskonventionen: sprechende Namen: isEmpty statt b17 (lange Variablennamen erzeugen keinen langen Code!) Variablennamen beginnen mit einem Kleinbuchstaben zusammengesetzte Namen Anfangsbuchstaben der Folgewörter groß Oliver Haase Hochschule Konstanz 17 Literale Literale sind typisierte Konstanten, die etwa verwendet werden können um Variablen zu initialisieren. Verschiedene Typen erfordern Literale in verschiedenen Formaten: Typ Beispielliterale byte 127, -128 short 32456 int 60273 long 13292367454L, 13292367454l float 87.363F, 87.363f double 37.266, 37.266D, 37.266d, 26.77e3 char 'A', 'h' boolean true, false Oliver Haase Hochschule Konstanz 18 Zuweisung eine Zuweisung (Assignment) erlaubt, einer Variablen v einen Wert w zuzuweisen w muss denselben (oder einen engeren) Typ haben wie v. Syntax (Schreibweise): v = w; Vorsicht: Das Gleichheitszeichen "=" bedeutet nicht "Test auf Gleichheit", sondern "mache linke Seite der rechter Seite gleich". In Pseudocode wird Zuweisung häufig geschrieben als: v w. Warum kann die linke Seite einer Zuweisung nur eine Variable und kein Literal sein? Oliver Haase Hochschule Konstanz 19 Zuweisung - Beispiele int i; int j; boolean isEmpty; double average; char naechstesZeichen; i = 178; j = i; isEmpty = true; average = 37.266; naechstesZeichen = 'h'; Oliver Haase oder auch: int i = 178, j; boolean isEmpty = true; double average = 37.266; char naechstesZeichen = 'h'; j = i; Hochschule Konstanz 20 automatische Typwandlung auch: implizite Typwandlung/Typanpassung/Typkonversion englisch: automatic/implicit type conversion/cast Werte engerer (niedriger) Typen können an Variablen weiteren (höheren) Typs zugewiesen werden Java führt automatische Konversion durch Aber nicht: Beispiel: int i = 17; long j; int i; long j = 42L; j = i; i = j; Oliver Haase Hochschule Konstanz 21 Skalare Typhierarchie Der Wertebereich eines engeren Typs ist eine Teilmenge des Wertebereichs eines weiteren Typs. Für die enger-Beziehung "◄" gelten folgende Regeln: 1. 2. 3. 4. Ganzzahltypen ◄ Gleitzahltypen Ganzzahltypen: byte ◄ short ◄ int ◄ long Gleitzahltypen: float ◄ double char ◄ int ‣ aus 1, 2 und 3 ergibt sich: byte ◄ short ◄ int ◄ long ◄ float ◄ double aus 1, 2 und 4 ergibt sich: char ◄ int ◄ long ◄ float ◄ double ‣ Oliver Haase Hochschule Konstanz 22 Skalare Typhierarchie Merke: Kein anderer Typ kann in boolean konvertiert werden, oder umgekehrt Die Wandlung von einer Ganzzahl in eine Gleitzahl kann zu Präzisionsverlust führen! int float long float long double Oliver Haase Hochschule Konstanz 23 explizite Typwandlung Explizite Typwandlung ist in zwei Richtungen möglich: aufwärts (englisch: upcast): enger Typ weiter Typ abwärts (englisch: downcast): weiter Typ enger Typ Abwärtskonvertierung führt zu Fehlern, wenn Wert nicht in niedrigeren Typen passt! Beispiel Aufwärtskonvertierung: int i = 17; long j; j = (long) i; Oliver Haase Hochschule Konstanz 24 explizite Typwandlung 1. Beispiel Abwärtskonvertierung: int i; long j = 42L; i = (int) j; 2. Beispiel Abwärtskonvertierung: int i; long j = 2500000000L; i = (int) j; i enthält den Wert -1794967296! – Warum? Oliver Haase Hochschule Konstanz 25 Strings Strings, d.h. Zeichenketten, sind kein skalarer Typ, sondern Objekte. Strings sind so fundamental, dass es wichtig ist Grundlegendes über ihre Verwendung zu wissen. Eine String-Variable wird genauso deklariert wie eine Variable skalaren Typs: String text; Einer String-Variablen kann ein Text zugewiesen werden: text = "Hallo, Welt!"; Beides kann zusammengefasst werden zu: String text = "Hallo, Welt"; Oliver Haase Hochschule Konstanz 26 Zu guter Letzt… We all know that 666 is the number of the Beast, but did you know that... 670 - Approximate number of the Beast DCLXVI - Roman numeral of the Beast 666.0000000 - Number of the High Precision Beast 665.9999954 - Number of the Pentium Beast 0.666 - Number of the Millibeast 1010011010 - Binary of the Beast $665.95 - Retail price of the Beast $699.25 - Price of the Beast plus 5% state sales tax $769.95 - Price of the Beast with all accessories and replacement soul $606.66 - Wal-Mart price of the Beast Route 666 - Way of the Beast 666 F - Oven temperature for roast Beast 666 mg - Recommended Minimum Daily Requirement of Beast Lotus 6-6-6 - Spreadsheet of the Beast Word 6.66 - Word Processor of the Beast i66686 - CPU of the Beast 666i - BMW of the Beast 668 - Next-door neighbor of the Beast Oliver Haase Hochschule Konstanz 27