Programmiertechnik
Skalare Typen,Variablen, Zuweisungen
Prof. Dr. Oliver Haase
int i;
long j;
boolean isEmpty;
double average;
char naechstesZeichen;
j = 42L;
i = (int) j;
isEmpty = true;
average = 37.266;
naechstesZeichen = 'h';
Zahlensysteme
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
Problem: Wie stellt man (große) Zahlen einfach, platzsparend und rechnergeeignet dar?
Römische Zahlen
Römische Zahlen
Symbole für
1: I 5: V
10: X 50: L
100: C 500: D
1000: M
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
Römische Zahlen
Römische Zahlen
Beispiele:
VI
IIX
MCMLXXXVIII
relativ kompakte Darstellung
kompliziert!
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
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
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
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]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
short 16 Bit -32‘768 32‘767
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
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
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!!!
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
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
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
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
Ü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
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;
Java Namenskonventionen:
sprechende Namen: isEmpty statt b17 (lange Variablennamen erzeugen keinen langen Code!)
Variablennamen beginnen mit einem Kleinbuchstaben
Merke: Erst Typ, dann Name!
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
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?
Zuweisung - Beispiele
int i;
int j;
boolean isEmpty;
double average;
char naechstesZeichen;
i = 178;
j = i;
isEmpty = true;
average = 37.266;
naechstesZeichen = 'h';
int i = 178, j;
boolean isEmpty = true;
double average = 37.266;
char naechstesZeichen = 'h';
j = i;
oder auch:
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
Beispiel: Aber nicht:
int i = 17;
long j;
j = i;
int i;
long j = 42L;
i = j;
Skalare Typhierarchie
Der Wertebereich eines engeren Typs ist eine Teilmenge des Wertebereichs eines weiteren Typs. Für die enger-Beziehung
"◄" gelten folgende Regeln:
1. Ganzzahltypen ◄ Gleitzahltypen
2. Ganzzahltypen: byte ◄ short ◄ int ◄ long 3. Gleitzahltypen: float ◄ double
4. 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
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
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;
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;
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";
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