Zahlendarstellung im Computer
Zahlendarstellung im Computer
Integer Zahlen
Die Darstellung von ganzzahligen Werten erfolgt im Computer durch das Binärsystem. Jedes Bit enthält eine Ziffer einer Binärzähl.
Bsp:
Überlauf
Ende der 1970er Jahre gab es zum Beispiel den Intel C4004 - ein 4 Bit Prozessor. Was passiert wenn man in einem 4Bit-Register den Wert 15 speichert und 1 addiert?
Das Ergebnis war 0. Diesen Sprung von der größten darstellbaren Zahl (15) auf die kleinste (0) nennt man Überlauf.
Überlauf (2)
Auch wenn wir heute keine 4Bit-Prozessoren mehr verwenden - das Problem besteht weiterhin.
Der Datentyp legt fest, wie viele Bits für die Speicherung zur Verfügung gestellt werden. Bei unsigned char
sind das 8 Bits, also die Zahlen von 0 bis 255.
Signed vs Unsigned
Wir haben auf der vorigen Folie den Datentyp unsigned char
kennengelernt. Der Datentyp kann positive Zahlen bis 255 und 0 darstellen.
Für negative Werte benötigt man einen Datentyp der auch das Vorzeichen mit speichert. Im Computer wird dafür ein Bit verwendet, das angibt ob die Zahl positiv oder negativ ist. Für positive Zahlen wird im ersten Bit 0 eingetragen, für negative Werte 1.
Der Datentyp signed char
kann die Zahlen von -127 bis +127 aufnehmen.
Signed Beispiel
Die kleinste darstellbare Zahl bei Signed Datentypen so dargestellt, dass das erste Bit 1 ist und alle weiteren Bits 0 sind. Dann wird wieder ganz normal hochgezählt.
4 Bit Beispiel
Dezimal | Binär |
---|---|
0 | 0000 |
+1 | 0001 |
+2 | 0010 |
+3 | 0011 |
+4 | 0100 |
+5 | 0101 |
+6 | 0110 |
+7 | 0111 |
-8 | 1000 |
-7 | 1001 |
-6 | 1010 |
-5 | 1011 |
-4 | 1100 |
-3 | 1101 |
-2 | 1110 |
-1 | 1111 |
Signed vs Unsigned (2)
Beispiel: Der Wert 1111 1111 entspricht als unsigned char der Dezimalzahl 255. Derselbe Wert entspricht aber als signed char der Dezimalzahl -1.
Es ist also wichtig zu wissen wie eine Zahl im Speicher zu interpretieren ist. Dafür verwenden wir Datentypen.
Überlauf bei Signed Datentypen
Der Überlauf funktioniert bei signed und unsigned auf Bitebene genau gleich. Dem Prozessor ist es also egal ob ihr mit Vorzeichen rechnet oder nicht.
Fließkommazahlen
Eine 32-Bit Fließkommazahl kann Werte zwischen und aufnehmen.
Wie kann das sein? Wenn wir einen ganzzahligen Wert speichern kommen wir doch maximal auf bis . Dabei können bei einer Kommazahl zwischen zwei ganzen Zahlen doch unendlich viele Zahlen vorkommen.
Interpretation von Fließkommazahlen
Dargestellt werden Fließkommazahlen natürlich wieder mit Bits - ein Computer kennt ja nichts anderes.
Dieses Mal werden die Bits aber in 3 Teile geteilt: Vorzeichen, Exponent und Mantisse.
32 Bit | 64 Bit | |
---|---|---|
Vorzeichen | 1 Bit | 1 Bit |
Exponent | 8 Bit | 11 Bit |
Mantisse | 23 Bit | 52 Bit |
Summe | 32 Bit | 64 Bit |
Fließkomma - Vorzeichen
Das Vorzeichen ist schnell erklärt 0 zeigt wie bei den signed Zahlen eine positive Zahl an, 1 eine Negative.
Fließkomma - Mantisse
Die Mantisse kann man wie eine ganzzahlige positive Zahl lesen. Bei 32 Bit haben wir dafür 23 Bit zur Verfügung. Es können also nicht so große Zahlen dargestellt werden, als wenn die ganzen 32 Bit verwendet würden.
Da jede Zahl außer 0 irgendwo mit einer 1 beginnen muss, wird das erste Bit nicht mitgespeichert um Platz zu sparen. Damit können 24 Bit gespeichert werden.
Fließkomma - Exponent
Der Exponent gibt an wo bei der Mantisse das Komma liegt. Er beschreibt also, wie oft der Integerwert verdoppelt oder halbiert werden muss, um den Wert der Fließkommazahl zu erhalten.
Bei einer 8 Bit Mantisse würden die Zahlen von 0 - 255 laufen. Da auch negative Exponenten möglich sind, wird die Zahl 0 auf 127 gelegt. Der Wertebereich verschiebt sich auf -127 bis +127
Fließkomma - Bsp
Die Zahl 1 als Fließkommawert:
Fließkomma - Bsp
Die Zahl 13 als Fließkommawert (binär: 1101):
Wäre der Exponent 0, so bedeutet dies , also , also Dezimal = 1,625.
Damit 1101 vor dem Komma steht, müssen wir die Bits um drei Stellen verschieben,
also Exponent + 3.
oder auch
also
.
Da die Nulldarstellung beim Exponenten 127 ist, müssen wir 127 + 3 = 130 als Binärzahl angeben, das entspricht 10000010.
Fließkommazahl Genauigkeit
Zwischen zwei ganzen Zahlen liegen unendlich viele Kommazahlen. Der Computer kann nicht alle Kommazahlen exakt darstellen. Die interpretierte Zahl wird immer errechnet indem die Mantisse mit dem Exponenten potenziert wird.
Fließkommazahlen - Warum?
Wir müssen bei der Arbeit mit Computern oft Tradeoffs eingehen. Legt man einen größeren Wert auf einen Aspekt, kann das negative Auswirkungen auf einen anderen haben. Zum Beispiel gibt es Algorithmen, die schneller das Ergebnis berechnen indem sie mehr Speicher verwenden.
Bei Zahlenwerten müssen wir die Aspekte Präzision (Precision), Wertebereich (Range), und Schnelligkeit (Performance) gegenüberstellen.
Kommazahlen mit fixierter Kommaposition bietet Präzision und gute Geschwindigkeit, es kann aber ein weit geringerer Wertebereich (Range) ausgenutzt werden. Da man in der Computer-Science meist hohe Performanz (Geschwindigkeit) und riesige Wertebereiche (Ranges) braucht, ist die Darstellung mit Gleitkommawerten bevorzugt.
Zahlendatentypen in C#
Type | Range | Size |
---|---|---|
sbyte | -128 bis 127 | Signed 8-bit integer |
byte | 0 bis 255 | Unsigned 8-bit integer |
short | -32.768 bis 32.767 | Signed 16-bit integer |
ushort | 0 bis 65.535 | Unsigned 16-bit integer |
int | -2.147.483.648 bis 2.147.483.647 | Signed 32-bit integer |
uint | 0 bis 4.294.967.295 | Unsigned 32-bit integer |
long | -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 | Signed 64-bit integer |
ulong | 0 bis 18.446.744.073.709.551.615 | Unsigned 64-bit integer |
Zahlendatentypen in C# (2)
Type | Approximate range | Precision | Size |
---|---|---|---|
float | bis | ~ 6-9 digits | 4 bytes |
double | bis | ~ 15-17 digits | 8 bytes |
decimal | bis | 28-29 digits | 16 bytes |
Decimal ist ein Fließkommadatentyp, der jedoch eine viel höhere Präzision als float und double bietet. Er wird z.B. für Berechnungen mit Geldbeträgen verwendet um Ungenauigkeiten zu vermeiden. Berechnungen mit dem decimal Datentype sind jedoch langsamer als mit float oder double.