2 Repräsentation von elementaren Daten
2 Repräsentation von elementaren Daten
2 Repräsentation von elementaren Daten
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
2 <strong>Repräsentation</strong> <strong>von</strong> <strong>elementaren</strong> <strong>Daten</strong><br />
Alle (elemtaren) <strong>Daten</strong> wie Zeichen und Zahlen werden im Dualsystem repräsentiert.<br />
Das Dualsystem ist ein spezielles B-adisches Zahlensystem, nämlich mit der<br />
Basis B=2.<br />
2.1 B-adische Zahlensysteme<br />
Im B-adischen Zahlensystem (mit B ≥ 2, B ∈ N) wird jede reelle Zahl wie<br />
folgt dargestellt:<br />
z = n−1 ∑<br />
i=−∞<br />
Beispiele:<br />
a i B i mit a i ∈ {0, .., B − 1}, n ∈ N +<br />
B=10 Dezimalsystem mit a i = {0, 1, .., 9}<br />
953, 48 = 8 · 10 −2 + 4 · 10 −1 + 3 · 10 0 + 5 · 10 1 + 9 · 10 2<br />
B=2 Dualsystem mit a i = {0, 1}<br />
1011, 01 = 1 · 2 −2 + 0 · 2 −1 + 1 · 2 0 + 1 · 2 1 + 0 · 2 2 + 1 · 2 3 = (11, 25) 10<br />
B=16 Hexadezimalsystem mit a i = {0, 1, .., 9, A, B, C, D, E, F }<br />
B30E=14 · 16 0 + 0 · 16 1 + 3 · 16 2 + 11 · 16 3 = (45838) 10<br />
B=1 geht nicht, weil nur die 0 darstellbar ist:<br />
z = n−1 ∑<br />
0 · 1 i = 0<br />
i=−∞<br />
Übliche Schreibweise: Falls z = n−1 ∑<br />
i=−∞<br />
a i B i dann schreibt man<br />
z = (a n−1 a n−2 · · · a 0 .a −1 a −2 · · · ) B bzw. falls B klar ist<br />
z = a n−1 a n−2 · · · a 0 .a −1 a −2 · · ·<br />
9
2.1.1 Rechnen im B-adischen System<br />
Definition: Seien a, b, q, r ∈ N und es ist a = b · q + r mit 0 ≤ r < b, dann<br />
gilt folgende Schreibweise:<br />
• a mod b = r<br />
• [ a<br />
b<br />
]<br />
= q<br />
Addition: Ziffernweise Addition mit Übertrag<br />
( c n−1 . . . c i . . . c 0 . c −1 . . . c −m ) B<br />
( d n−1 . . . d i . . . d 0 . d −1 . . . d −m ) B<br />
( e n e n−1 . . . e i . . . e 0 . e −1 . . . e −m ) B<br />
mit e i = (c i + d i + ü i−1 ) mod B und e n = ü n−1<br />
]<br />
ü i =<br />
und ü −m−1 = 0<br />
Beispiel:<br />
[<br />
ci +d i +ü i−1<br />
B<br />
A50F.5<br />
0B52.6<br />
B061.B<br />
101011.11<br />
110110.01<br />
1100010.00<br />
Multiplikation: Schriftlich multiplizieren<br />
c = n−1 ∑<br />
i=−m<br />
c i B i<br />
∑k−1<br />
c·d = c·<br />
j=−l<br />
d j B j =<br />
d = k−1 ∑<br />
∑k−1<br />
j=−l<br />
j=−l<br />
d j B j<br />
cd j B j =<br />
∑k−1<br />
j=−l<br />
( n−1 ∑<br />
i=−m<br />
c i B i d j<br />
)<br />
B j =<br />
∑k−1<br />
j=−l<br />
( n−1 ∑<br />
i=−m<br />
c i d j B i )<br />
B j<br />
e ij = (c i · d j + ü i−1,j ) mod B<br />
[ ]<br />
ci·d<br />
ü ij =<br />
j +ü i−1,j<br />
und ü −m,j = 0<br />
B<br />
kleinste Stelligkeit B −m · B −l = B −(m+l)<br />
10
Beispiel:<br />
37.24 · 6.368<br />
22344<br />
11172<br />
22344<br />
29792<br />
23714432<br />
101, 01 · 10, 1<br />
10101<br />
00000<br />
10101<br />
1101001<br />
Wir haben nun gesehen wie man im B-adischen Zahlensystem und insbesondere<br />
auch im dualen Zahlensystem ganz schematisch Zahlen addieren und<br />
multiplizieren kann.<br />
Wir Menschen sind es gewohnt im Dezimalsystem zu rechnen, während Rechner<br />
im Dualsystem arbeiten → Notwendigkeit Darstellung umzuwandeln<br />
2.1.2 Umrechnung <strong>von</strong> Darstellungen<br />
b-adische Darstellung<br />
} {{ }<br />
Quellsystem<br />
→ B-adische Darstellung<br />
} {{ }<br />
Zielsystem<br />
Im Prinzip 2 Möglichkeiten, wir sehen uns nur eine an, nämlich Rechnen<br />
im Zielsystem<br />
Beachte: Exakte Umrechnung für Dezimalzahlen nicht immer möglich<br />
Rechnen im Zielsystem (natürliche Zahlen)<br />
• verwende Hornerschema zur Darstellung im Quellsystem, d.h.<br />
∑n−1<br />
z = a i b i = a 0 +a 1 b+. . .+a n−1 b n−1 = a 0 +b(a 1 +b(a 2 +. . .+b(a n−2 +ba n−1 ) . . .))<br />
i=0<br />
11
• stelle die a i und b im Zielsystem dar und berechne entsprechenden Term<br />
Beispiele:<br />
Umrechnung der Hexadezimalzahl EF01 ins Dezimalsystem<br />
EF 01 = [1+10(0+10(F +10E))] 16 = [1+16(0+16(15+16·14))] 10 = 61185<br />
Umrechnung der Dezimalzahl 81 ins Dualsystem<br />
81 = (1 + 10 · 8) 10 = (1 + 1010 · 1000) = 1010001<br />
Bei Dezimalzahlen wendet man obiges Schema getrennt auf Vor- und Nachkommabereich<br />
an, d.h.<br />
z =<br />
∑n−1<br />
i=−m<br />
a i b i =<br />
∑−1<br />
i=−m<br />
∑n−1<br />
a i b i + a i b i =<br />
i=0<br />
b −1 (a −1 + b −1 (a −2 + · · · + b −1 (a −m+1 + b −1 a−m)...))<br />
+a 0 + b(a 1 + b(a 2 + · · · + b(a n−2 + ba n−1 )...))<br />
Problem: Darstellung <strong>von</strong> b −1 im Zielsystem<br />
z.B. b=10 B=2<br />
(0, 1) 10 = 10 −1 · 1 ≈ (0, 00011001101) 2 = 0, 10009765625<br />
→ Fehler bei Zahlenumwandlung<br />
2.2 <strong>Repräsentation</strong> <strong>von</strong> Zeichen<br />
Im Rechner sind nur Binärzahlen repräsentierbar<br />
→ Codierung <strong>von</strong> Zeichen als Binärzahl<br />
2.2.1 ASCII-Code<br />
• American Standard Code for Information Interchange (1963)<br />
• Initial entwickelt zur Übermittlung und zum Ausdrucken <strong>von</strong> Texten<br />
⇒ In ASCII sind sowohl Zeichen wie Klein- und Großbuchstaben oder<br />
Ziffern als auch Steuerzeichen zum Drucken codiert<br />
12
• ASCII-Code verwendet 7 Binärstellen → 7 Bit-Code ̂= 2 7 = 128 unterschiedliche<br />
Zeichen sind kodierbar<br />
Mittlerweile Standard: 1 Byte = 8 Bit als elementare <strong>Repräsentation</strong>seinheit<br />
im Rechner ⇒ achtes Bit frei ⇒<br />
13
1. Verwendung als Paritätsbit um <strong>Daten</strong>übertragung zu überprüfen, d.h.<br />
falls 8.Bit = 0 → restliche 7 Bit enthalten gerade Anzahl <strong>von</strong> Einsen<br />
falls 8.Bit = 1 → restliche 7 Bit enthalten ungerade Anzahl <strong>von</strong> Einsen<br />
2. Erweiterter Zeichensatz → ANSI Extended ASCII<br />
Es gibt jedoch noch viele weitere Zeichen → kyrillisch, arabisch, chinesisch<br />
Rrightarrow Unicode<br />
2.2.2 Unicode<br />
• genormtes System zur Kodierung <strong>von</strong><br />
– Textzeichen (Buchstaben, Silbenzeichen, Ideogramme, Satzzeichen,<br />
Sonderzeichen, Ziffern)<br />
– mathematischen, kaufmännischen (z.B. Firmensymbole) und technischen<br />
Sonderzeichen<br />
• Versuch alle bekannten Zeichen aller Alphabete zu kodieren, neben<br />
lateinischen Zeichen auch Zeichen für griechisches, kyrillisches, arabisches,<br />
hebräisches und thailändisches Alphabet, japanische, chinesische,<br />
koreanische Zeichen auch tote Sprachen wie z.B. Hieroglyphen, Runen<br />
• Version 3.1 (März 2001) umfasst 94.140 Zeichen<br />
→ 3 Byte benötigt, 4 Byte verwendet (Reserve für zusätzliche Zeichen)<br />
⇒ großer (meist unnötiger) Speicherverbrauch<br />
⇒ Verwendung nur der ersten beiden Bytes (→ 65.536 Zeichen) für<br />
gebräuchliche Anwendungen (normale Kommunikation) ausreichend<br />
̂= UCS-2 (universal character set 2)<br />
14
⇒ Codierung mit variabler Länge → UTF-8 (unicode transformation<br />
format)<br />
– Wird nur 1 Byte verwendet ⇒ linkes Bit = 0<br />
→ 128 Zeichen kodierbar = ASCII-Zeichen z.B. 0xxxxxxx<br />
– Werden mehr Bytes benötigt (maximal 4)<br />
→ linkes Bit = 1 ∧ Anzahl der folgenden 1 mit Abschluss 0 gibt die<br />
Anzahl der noch zugehörigen Bytes an, die jeweils mit 10 beginnen<br />
Beispiel:<br />
0xxxxxxx (2 7 Zeichen)<br />
110xxxxx 10xxxxxx (2 11 Zeichen)<br />
1110xxxx 10xxxxxx 10xxxxxx (2 16 Zeichen)<br />
11110xxx 10 }{{} xxxxxx 10xxxxxx 10xxxxxx (221 Zeichen)<br />
bei gestörter Übertragung weiß man, dass hier nicht der Anfang sein<br />
kann<br />
2.3 <strong>Repräsentation</strong> ganzer Zahlen<br />
Bei heutigen Rechnern werden ganze Zahlen meist in 4 Byte = 32 Bit repräsentiert<br />
→ 2 32 = 4.294.976.296 Zahlen darstellbar<br />
Da man auch negative ganze Zahlen darstellen will<br />
→ Halbierung des darstellbaren Zahlenbetrags<br />
2.3.1 Darstellung durch Vorzeichen und Betrag<br />
VZ<br />
Betrag in 31 Bit<br />
VZ = 0 falls positive Zahl<br />
VZ = 1 falls negative Zahl<br />
⇒ darstellbarer Bereich<br />
−2 31 = −2.147.483.648 bis 2.147.483.648 = 2 31<br />
15
Nachteil: Addition und Subtraktion unterschiedlich<br />
z.B. 5 − 3 = 5 + (−3)<br />
00000101<br />
10000011<br />
10001000 ̂= − 8 Widerspruch<br />
2.3.2 Zweierkomplement-Darstellung<br />
Diese Darstellung wird am häufigsten verwendet.<br />
falls x ≥ 0 → 0 . . . x (als Binärzahl)<br />
falls x < 0 → 1 . . . y = 2 N − |x| (als Binärzahl)<br />
→ Zweierkomplement, da Komplement zu 2 N<br />
Y = 2 N − |x| = 2 N − 1 − |x| + 1=<br />
(111...11) 2 ̂= 2 N − 1<br />
-( x) 2 ̂= |x|<br />
+(00...001) 2 ̂= +1<br />
⇒ 2er-Komplement <strong>von</strong> |x| → Invertiere alle Bits <strong>von</strong> x und addiere 1<br />
Rückumwandlung: y = 2 N − |x| ⇔ |x| = 2 N − y ⇒<br />
analoge Vorgehensweise: Invertierung aller Bits und Addition <strong>von</strong> 1<br />
z.B. 5 − 3 = 5 + (−3)<br />
00000101 00000011<br />
+11111101 ↓Invertieren<br />
100000010 111111100<br />
↓ ↓Addition <strong>von</strong> 1<br />
Übertrag ignorieren 11111101 ̂=(−3)<br />
16
z.B. 3 − 5 = 3 + (−5)<br />
00000011<br />
11111011<br />
11111110 ̂= − 2<br />
↓ Invertieren<br />
00000001<br />
↓ Addition <strong>von</strong> 1<br />
00000010<br />
2.3.3 Einerkomplement-Darstellung<br />
Falls x ≥ 0 → 0 . . . x (als Binärzahl)<br />
17
Falls x < 0 → 1 y = 2 N − 1 − |x| (als Binärzahl)<br />
Invertiere für |x| alle Bits, analog Rücktransformation<br />
z.B. 3 − 5 = 3 + (−5)<br />
00000011 NR: 00000101<br />
11111010 ↓ Invertieren<br />
11111101 11111010 ̂=(−5)<br />
↓Invertieren<br />
00000010<br />
18
2.4 <strong>Repräsentation</strong> <strong>von</strong> Dezimalzahlen<br />
Wegen Beschränkung auf bestimmte Anzahl <strong>von</strong> Bits → kleiner Ausschnitt<br />
<strong>von</strong> R darstellbar.<br />
Festkommadarstellung: x } .{{ . . x}<br />
x } .{{ . . x}<br />
v Bits n Bits<br />
nicht gebräuchlich, da<br />
• bei kleinem v → keine großen Zahlen darstellbar<br />
• bei kleinem n → keine ganz kleinen Zahlen und Nachkommaanteile sehr<br />
ungenau darstellbar<br />
2.4.1 Gleitkommadarstellung<br />
m Mantisse<br />
B Basis<br />
e Exponent<br />
m · B e<br />
z.B.: 1, 245<br />
} {{ }<br />
m<br />
· 10 }{{}<br />
B<br />
bzw. im Binärsystem<br />
}{{}<br />
−<br />
Vorzeichen<br />
} 0.1101 {{ }<br />
m<br />
· 2 }{{}<br />
B<br />
e<br />
{}}{<br />
12<br />
e<br />
{}}{<br />
1010<br />
Darstellung nicht eindeutig:<br />
z.B. 1 2 = 0.1 · 20 = 0.01 · 2 1 = ... = 1.0 · 2 −1 = ... (Binärsystem)<br />
⇒normierte Darstellung<br />
z.B. 1 ≤ m < 2<br />
19
⇒ 1 2<br />
1<br />
4<br />
3<br />
4<br />
→ 1.0 · 2−1<br />
→ 1.0 · 2−2<br />
→ 1.1 · 2−1<br />
⇒ erstes Bit immer 1 →kann weggelassen werden (hidden Bit)<br />
⇒ eine Stelle mehr Genauigkeit, ohne höhere Kosten<br />
Seit 1985 IEEE Standard 754<br />
• einfache Genauigkeit (float → 32Bit)<br />
Da man sowohl große wie auch sehr kleine Zahlen darstellen will<br />
→ Exponent positiv und negativ<br />
Bei 2er-Komplement −128 ≤ e < 127<br />
z.B. Bei Addition muss Exponent verschoben werden →<br />
Exponent in versetzter Darstellung, d.h. implizit wird 127 abgezogen.<br />
z.B.: e = (10110000) 2 = 176 10 − 127 10 = 49 10<br />
⇒ −127 ≤ e ≤ 128 (eigentlich, aber -127 und 128 für spezielle Werte)<br />
2 −126 ...2 127 normalisierter Bereich<br />
Eine mit (se 7 ...e 0 m 22 ...m 0 ) dargestellte Gleitkommazahl hat den Wert<br />
(−1) s (1.m 22 ...m 0 )2 (e 7...e 0 −127)<br />
Frage: Wie stellt man 0 dar → geht so nicht direkt<br />
Frage: Warum steht der Exponent vor der Mantisse?<br />
Größenvergleich einfacher → analog ganze Zahlen, falls man<br />
e 7 ...e 0 m 22 ...m 0 als ganze Zahl auffasst.<br />
20
Neben den normalen Gleitkommazahlen gibt es spezielle Werte<br />
Exponent Mantisse Bedeutung<br />
-127 (0...0) 0...0 ±0 (keine normalisierte Darstellung möglich)<br />
-127 (0...0) ≠ 0...0 0.m · 2 −126 denormalisierte Zahl<br />
+128 (1...1) 0...0 ±∞ 1:0 > 4 → TRUE<br />
+128 (1...1) ≠ 0...0 NaN not a number z.B.: √ −1<br />
• doppelte Genauigkeit (double → 64 Bit)<br />
d.h.: (−1) s · 1.m · 2 e−1023 0 < e < 2047 (normalisierte Darstellung)<br />
(−1) s · 0.m · 2 −1022<br />
Falls e=0 (denormalisierte Darstellung)<br />
größte darstellbare Zahl: ≈ 10 308<br />
kleinste positive darstellbare Zahl: ≈ 10 −324<br />
2.4.2 Gleitkommaoperationen<br />
Multiplikation:<br />
Addit. der Expon.<br />
{ }} {<br />
m 1 2 r1 · m 2 2 r 2<br />
= m 1 m } {{ } 2 ·2 r 1 + r 2<br />
Multipl. der Mant.<br />
1. Bei Addition der Exponenten muss die versetzte Darstellung beachtet<br />
werden, d.h. 2 e1 · 2 e 2<br />
= 2 r 1+127 · 2 r 2+127 = 2 r 1+r 2 +127+127<br />
21
korrektes Ergebnis aber: 2 r 1+r 2 +127<br />
⇒ Addiere beide Exponenten und addiere dann (-127)<br />
2. Multiplikation der Mantissen<br />
- evtl. neu normalisieren<br />
Addit. der Expon.<br />
{ }} {<br />
z.B. 1.11 × 1.11 = 11.0001 → 1.10001 · 2 e + 1<br />
3. Vorzeichen s r = (s 1 + s 2 ) mod 2<br />
Addition:<br />
f = s 1 m 1 2 e 1<br />
+ s<br />
} {{ } 2 m 2 2 e 2<br />
} {{ }<br />
c<br />
d<br />
Beispiel:<br />
1.101 · 2 0 + −1.111 · 2 2<br />
(1.625) 10 − (7.5) 10 = (−5, 875) 10<br />
1. Falls e 2 > e 1 vertausche c und d<br />
−1.111 · 2 2 + 1.101 · 2 0<br />
2. Falls s 1 ≠ s 2 bilde 2er-Komplement <strong>von</strong> m 2<br />
(Falls m 1 negativ wird das Ergebnis (m 1 − m 2 ) später negiert → m 2 −<br />
m 1 )<br />
01.101<br />
↓ Inv.<br />
10.010<br />
00.001<br />
10.011 ̂=m 2 in 2er-Komplement<br />
3. denormalisiere m 2 durch Verschiebung um e 1 − e 2 nach rechts → beide<br />
Exponenten gleich<br />
arithm. Verschieben<br />
↗<br />
↘<br />
neg. Zahl → führende 1<br />
pos. Zahl → führende 0<br />
22
e 1 − e 2 = 2<br />
11.10011 · 2 2<br />
4. Addiere beide Mantissen<br />
01.11100<br />
11.10011<br />
(1)01.01111 ·2 2<br />
Überlauf ignorieren<br />
5. normalisiere Ergebnis 1.01111 · 2 2<br />
6. berücksichtige Vorzeichen:<br />
Falls s 1 ≠ s 2 ∧ s 1 = 1 → s f = 1<br />
−1.01111 · 2 2 = −5.875<br />
23