i = (int)

Transcription

i = (int)
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