2.5 Primitive Datentypen

Werbung
2.5 Primitive Datentypen
Wir unterscheiden 5 primitive Datentypen:
•
•
•
•
•
ganze Zahlen -2, -1, -0, -1, -2, ...
reelle Zahlen 0.3, 0.3333..., π , 2.7 · 10−4
Zeichen ’a’, ’b’, ’c’, ...
Zeichenreihen "Hello World", "TIFI", "%$&", "", ...
Wahrheitswerte false,true
»
¾
½
Rainer Feldmann
Universität Paderborn
Zeichenreihen sind eigentlich kein primitiver Datentyp.
Wir behandeln sie hier aber dennoch.
Technische Informatik für Ingenieure (TIFI)
¼
WS 09/10
88
Vier Repräsentationen ganzer Zahlen
Datentyp
byte
short
int
long
Größe
1 Byte
2 Byte
4 Byte
8 Byte
Darstellungsbereich
-128, ..., 127
-32768, ... ,32767
-21474833648, ... , 21474833647
-9223372036854775808, ... , 9223372036854775807
¾
»
Allgemein: k Bytes enthalten n = 8k Bits. Mit diesen
werden die Zahlen −2n−1, ..., 2n−1 − 1 dargestellt.
½
Rainer Feldmann
Universität Paderborn
¼
Technische Informatik für Ingenieure (TIFI)
WS 09/10
89
Darstellung ganzer Zahlen im 2-Komplement
Im 2-Komplement mit n Bits repräsentiert die Bitfolge dn−1 . . . d0 die ganze Zahl
Pn−2
x = −dn−12n−1 + i=0 di2i
P2
Beispiel: n = 4, x = −d323 + i=0 di2i
d3
0
0
0
...
0
1
1
1
...
1
1
d2
1
1
1
d1
1
1
0
d0
1
0
1
0
1
1
1
0
1
1
0
0
1
0
1
0
0
0
0
1
0
Rainer Feldmann
Universität Paderborn
x
7
6
5
...
0
-1
-2
-3
...
-7
-8
Berechnung des n-Bit 2-Komplements einer Zahl x ≥ 0:
for (i=0; i<=n-2; i++) {
Out.println(x%2); x = x/2;
} /* Bitreihenfolge beachten! */
Out.println(0); /* Vorzeichenbit für x ≥ 0 */
Berechnung des n-Bit 2-Komplements einer Zahl x < 0:
1) berechne die di für −x wie oben;
2) invertiere alle Bits
3) addiere 1
Technische Informatik für Ingenieure (TIFI)
Bsp. für x = −7
|x| = 0111
invertieren: 1000
1 addieren: 1001
WS 09/10
90
Darstellung ganzer Zahlen im 2-Komplement
Im 2-Komplement mit n Bits repräsentiert die Bitfolge dn−1 . . . d0 die ganze Zahl
Pn−2
x = −dn−12n−1 + i=0 di2i
Beispiel: n = 4, x = −d323 +
d3
0
0
0
...
0
1
1
1
...
1
1
d2
1
1
1
d1
1
1
0
d0
1
0
1
0
1
1
1
0
1
1
0
0
1
0
1
0
0
0
0
1
0
Rainer Feldmann
Universität Paderborn
x
7
6
5
...
0
-1
-2
-3
...
-7
-8
P2
i
d
2
i
i=0
Addition zweier Zahlen im 2-Komplement:
0 0 1 1
3
+ 1 0 1 1 -5
= 1 1 1 0 -2
Überlauftest bei Addition zweier Zahlen im 2-Komplement:
Schreibe das jeweils erste Bit noch einmal hin. Addiere ganz
normal und vergleiche die ersten beiden Bits des Ergebnisses.
Bei Gleichheit ist das Ergebnis OK, sonst nicht.
0 0 1 1 1
7
+ 0 0 0 0 1
1
= 0 1 0 0 0 -8
Technische Informatik für Ingenieure (TIFI)
WS 09/10
91
Zwei Repräsentationen reeller Zahlen
Datentyp
float
double
Größe
4 Byte
8 Byte
Vorzeichen
1 Bit
1 Bit
Exponent
8 Bits
11 Bits
Mantisse
23 Bits
52 Bits
• Die Repräsentationen float und double heißen Gleitkommazahlen.
• Die Codierung von Gleitkommazahlen x ist dreigeteilt:
X
Vorzeichen s
XXXXXXXX. . .
Exponent e
XXXXXXXXXXXXXXXXXXXXXXX. . .
Mantisse f
'
$
s = 0 genau dann wenn die Gleitkommazahl x ≥ 0 ist.
e liefert den Exponenten für einen Faktor 2z .
Pk
−i
f = f1f2 . . . fk wird interpretiert als
i=1 fi · 2 , d.h. als eine Zahl aus [0, 1[.
&
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
%
92
Zwei Repräsentationen reeller Zahlen
Datentyp
float
double
X
Vorzeichen s
Größe
4 Byte
8 Byte
Vorzeichen
1 Bit
1 Bit
XXXXXXXX. . .
Exponent e
Mantisse
23 Bits
52 Bits
XXXXXXXXXXXXXXXXXXXXXXX. . .
Mantisse f
8
s
e−127
× 1.f
< (−1) × 2
s
−126
Wert(float) =
(−1) × 2
× 0.f
:
(−1)s × ∞
8
s
e−1023
× 1.f
< (−1) × 2
Wert(double) =
(−1)s × 2−1022 × 0.f
:
(−1)s × ∞
Rainer Feldmann
Universität Paderborn
Exponent
8 Bits
11 Bits
falls 0 < e < 255
falls e = 0
falls e = 255
falls 0 < e < 2047
falls e = 0
falls e = 2047
Technische Informatik für Ingenieure (TIFI)
(normalisiert)
(subnormal)
(unendlich, NaN)
(normalisiert)
(subnormal)
(unendlich, NaN)
WS 09/10
93
Größte und kleinste darstellbare Gleitkommazahlen
Die größte mit float darstellbare Zahl liegt knapp unter
254−127
2
| {z } ·
e=254
0
Vorzeichen
2
|{z}
= 2128 ≈ 3.4 · 1038
f =1−2−23
11111110
Exponent
11111111111111111111111
Mantisse
Die kleinste positive mit float darstellbare Zahl ist
−126
−23
−149
2
≈ 1.4 · 10−45
| {z } · 2
|{z} = 2
e=0
0
Vorzeichen
Rainer Feldmann
Universität Paderborn
f =2−23
00000000
Exponent
00000000000000000000001
Mantisse
Technische Informatik für Ingenieure (TIFI)
WS 09/10
94
Größte und kleinste darstellbare Gleitkommazahlen
Die größte mit double darstellbare Zahl liegt knapp unter
|2
0
Vorzeichen
2046−1023
{z
e=2046
11111111110
Exponent
}·
2
|{z}
= 21024 ≈ 1.8 · 10308
f =1−2−52
1111111111111111111111111111111111111111111111111111
Mantisse
Die kleinste positive mit double darstellbare Zahl ist
2−1022 · 2−52 = 2−1074 ≈ 4.9 · 10−324
0
Vorzeichen
00000000000
Exponent
Rainer Feldmann
Universität Paderborn
0000000000000000000000000000000000000000000000000001
Mantisse
Technische Informatik für Ingenieure (TIFI)
WS 09/10
95
Addition und Multiplikation von Gleitkommazahlen
Multiplikation: (Exponenten addieren, Mantissen multiplizieren)
Beispiel (float):
12
1.5 · 23
1.5 · 1.25
1.875
∗
∗
∗
∗
20
1.25 · 24
23 · 24
27
=
=
=
=
240
Addition: (Exponenten angleichen, Mantissen addieren)
Beispiel (float):
12
1.5 · 23
0.75 · 24
(0.75 + 1.25)
1
Rainer Feldmann
Universität Paderborn
+
+
+
∗
∗
20
1.25 · 24
1.25 · 24
24
25
=
=
=
=
=
Technische Informatik für Ingenieure (TIFI)
32
WS 09/10
96
Genauigkeit und Fehler bei Gleitkommazahlen
Beispiel:
1
1048576
−20
=
+
2−30 · 210
=
+
0 · 210
=
1024
+
1 · 210
+
1 · 210
1 · 210
1·2
=
1024
Bei 23 Bits für die Mantisse ist 2−30 nicht mehr darstellbar.
'
$
In der Gleitkommaarithmetik hat die Gleichung
(1 + x) = 1 für x > 0
Lösungen (wähle x wie im obigen Beispiel klein genug)!
&
%
Die kleinste positive darstellbare Zahl ², für die in der Gleitkommaarithmetik 1 + ² > 1 gilt, heißt
Maschinengenauigkeit.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
97
Fehler und Geschwindigkeit bei Gleitkommazahlen
Assoziativgesetz und Distributivgesetz gelten in der Gleitkommaarithmetik nicht:
(x + y) + z 6=G² x + (y + z)
bzw.
x · (y + z) 6=G² x · y + x · z
Beweis (Nichtassoziativität): Es sei ε die Maschinengenauigkeit.
1 + ( 2ε + 2ε ) =Gε 1 + ε 6=Gε 1 =Gε 1 +
ε
2
=Gε (1 + 2ε ) +
ε
2
• Gleitkommazahlen können gerundete Näherungen reller Zahlen sein.
• Durch gerundete Näherungen entstehen Rundungsfehler.
• Rundungsfehler können sich in Rechnungen fortpflanzen und wachsen.
²
¯
Die Numerik beschäftigt sich mit dem “bedachten Umgang” mit Gleitkommazahlen!
±
°
• Gleitkommaarithmetik ist deutlich langsamer als Ganzzahlarithmetik.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
98
Der Datentyp Character (char)
• char dienen zur Darstellung von Zeichen.
• Codierung: 2 Byte breite Zahlen.
• Für Java gewählte Standardcodierung: Unicode (www.unicode.org/charts).
Zeichen
Codierung
...
’1’
49
’2’
50
...
’A’
65
’B’
66
...
’a’
97
’b’
98
...
• Durch die Codierung in Zahlen kann man chars vergleichen (<,<=,!=,...).
• Also gilt ’0’ < ’1’ < ... < ’A’ < ’B’ < ... < ’a’ < ’b’ < ...
• Es gibt Sonderzeichen, die durch Escape-Sequenzen dargestellt werden:
– ’\n’ repräsentiert den Zeilenumbruch.
– ’\r’ repräsentiert den Cursorrücklauf.
– ’\’’ repräsentiert das Apostroph.
– ’\\’ repräsentiert den Backslash.
– ...
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
99
Zeichenreihen (Strings)
• Strings sind Folgen von chars.
• Darstellung in Java in Doppelhochkommata "bla" statt Hochkommata ’a’ (wie bei char).
• String ist eigentlich kein primitiver Datentyp sondern eine Java-Klasse, die in einer StandardBibliothek implementiert ist.
• Für Strings gibt es viele nützliche Operationen:
– String a = a + "Wld"; // hängt dem String, auf den a verweist, den String "Wld" an.
– int b = a.length(); // legt die Anzahl der chars im String a in der Variablen b ab.
– char c = a.charAt(3); // speichert das dritte Zeichen des Strings a unter c ab.
– int i = a.indexOf("sub"); // liefert die Position des ersten Auftretens des Substrings
"sub" im String a und speichert sie in der Variablen i;
– int j = Integer.parseInt("123"); // Speichert den Wert 123, der als String eingelesen wird, als ganzzahligen Wert in der Variablen j ab.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
100
Typisierung
• In Java haben Variablen einen eindeutig definierten Typ.
• Der Typ wird bei der Deklaration festgelegt:
int n;
double x;
Konstanten
• Der Wert einer Variablen kann durch Verwendung des Schlüsselworts final fixiert werden:
final int MAX GRAD = 360;
final double PI = 3.1415926536;
• Solche benannten Konstanten können die Lesbarkeit verbessern.
• Sie können die Programmierarbeit erleichtern.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
101
Variablendeklaration
Syntax
<VarDekl>
::=
<Typ> <Bezeichner>[ = <Ausdruck>]
{ , <Bezeichner>[ = <Ausdruck>]}
<Bezeichner>
::=
<Buchstabe> {<Buchstabe> | <Ziffer>}
<Typ>
::=
int | long | byte | short|
double | float |
char | String |
···
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
102
Typisierung von Ausdrücken
Operatoren
• Abhängig vom Typ der Operanden ist für jeden Operator festgelegt, welchen Typ das Ergebnis
hat:
int n,m;
double x,y;
1
n
x
x
∗ 2
+ m
/ y
< y
\\
\\
\\
\\
Ergebnis
Ergebnis
Ergebnis
Ergebnis
ist
ist
ist
ist
vom
vom
vom
vom
Typ
Typ
Typ
Typ
int
int
double
boolean
Ausdrücke
• Der Ergebnistyp eines Ausdrucks ergibt sich induktiv anhand seines Ableitungsbaumes.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
103
Polymorphie (Überladung)
• Der Operator + ist für die Addition von Integern vergeben.
• Wir möchten aber auch zwei Zahlen vom Typ double mit demselben Symbol addieren!
• Lösung: Überladen des Operators + :
– Die Typen der Operanden sind bekannt.
– Man kann sie benutzen, um den Operator eindeutig zu identifizieren.
• So wird der Operator + "vielgestaltig"(polymorph):
.+.
.+.
.+.
Rainer Feldmann
Universität Paderborn
:
:
:
int × int → int
double × double → double
String × String → String
Technische Informatik für Ingenieure (TIFI)
WS 09/10
104
Implizite Typumwandlungen
• Durch Konvertierung (Umwandlung) von Typen werden Operatoren noch mehr Gestalten
gegeben:
.+. :
.+. :
.+. :
int × double → double
int × String → String
double × String → String
• Dabei wird der Wert der Variable vom Typ int vor Ausführung des + -Operators in den Wert
einer Variable vom Typ double umgerechnet.
• Wenn keine Daten verloren gehen, wird eine solche Umwandlung automatisch vorgenommen
(implizite Typumwandlung).
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
105
Explizite Typumwandlungen
• Implizite Typumwandlungen existieren nicht für alle Operationen.
• Manchmal sind implizite Typumwandlungen auch unerwünscht.
• Daher kann man explizit angeben wie umgewandelt werden soll:
<TypeCast>
::=
( <Typ> ) <Ausdruck>
¯
²
Achtung: Der TypeCast-Operator bindet stärker als die numerischen Operatoren.
±
°
Klammern setzen hilft auch hier:
short s;
int n;
(short) s + n; /* Ergebnis ist vom Typ int(!) */
(short) (s + n); /* Ergebnis ist vom Typ short */
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
106
Implizite und explizite Typumwandlungen
$
'
double ⊃ float ⊃ long ⊃ int ⊃ short ⊃ byte
Der “kleinere” Operandentyp wird vor der Ausführung der Operation in den
“größeren” Operandentyp konvertiert. Der Ausdruck bekommt dann den
gleichen Typ wie seine Operanden, zumindest aber den Typ int.
&
%
Beispiele: double d; float f; int i; short s; String str;
f = i; d = 3.14; f = 3.14f;
i = f; f = 3.14;
i = (int) f;
...
...
...
...
...
...
Rainer Feldmann
Universität Paderborn
/* ok */
/* wrong */
/* ok, aber Nachkommastellen gehen verloren */
f + i ...
d*(f + i) ...
s+s ...
f/3 ... (float) i/3 ...
i/3 ...
str + i ... str + f ... str + d ... str + s
/* ist float
/* ist double
/* ist int
/* sind float
/* ist int
/* sind String
Technische Informatik für Ingenieure (TIFI)
*/
*/
*/
*/
*/
*/
WS 09/10
107
Herunterladen