Mail to Code: Tutorial

Lernt, wie man den Code für Rechenknechte schreibt.

English version English Version

Besondere Variablen als Dualzahlen


Darstellung von Dualzahlen im Programmcode

Wie in späteren Kapiteln zu lesen sein wird, ist es beim Programmieren oftmals sinnvoll, eine Zahl im Dualsystem zu verwenden und dann auch als solche aufzuschreiben. So entspricht die Zahl "229" im Dezimalsystem, der Zahl "11100101" im Dualsystem. Der Kompiler muss aber nun wissen, welches Zahlensystem denn nun gemeint ist. Um das klarzumachen, wird einer Dualzahl die Zeichenfolge "0b" vorangestellt. Somit gilt:
229 = 0b11100101
Da wir mit einem 8-Bit Mikrocontroller arbeiten, ist es sinnvoll, die führenden Nullen ebenfalls zu schreiben, so dass die Dualzahl immer aus 8 Stellen besteht. Damit gilt:
17 = 0b00010001
114 = 0b01110010

1
2
3
4
5
6
void setup() {
  // Load binary numbers into a variable
  a = 0b11100101; // load dezimal 229 into variable 'a'
  b = 0b00010001; // load dezimal 17 into variable 'b'
}
 
    

Ganzzahlige Variablen mit Vorzeichen als Dualzahl, einfache Version

In dem Kapitel zum Dualsystem haben wir gesehen, wie Zahlen in diesem System dargestellt werden. Bei positiven Zahlen verzichtet man der Einfachheit halber auf die Angabe des "+" als Vorzeichen. Wie sieht es aber mit der Darstellung negativer Zahlen aus?
Nun, für das "-" wird zweifelsfrei ein Bit benötigt. Ist eine Zahl als Vorzeichenbehaftete Zahl definiert (z.B. int8_t) als 8-Bit Ganzzahl mit Vorzeichen, so wird das höchstwertige Bit zur Darstellung des Vorzeichens verwendet und die restlichen 7 Bit zur Darstellung des Zahlwertes. Dabei entspricht die "0" positiven Werten (+) und die "1" negativen Werten (-). Somit ergeben sich:

+127 = 01111111
+126 = 01111110
+125 = 01111101
+124 = 01111100
...
...
  +3 = 00000011
  +2 = 00000010
  +1 = 00000001
  +0 = 00000000
  -0 = 10000000
  -1 = 10000001
  -2 = 10000010
  -3 = 10000011
...
...
-125 = 11111101
-126 = 11111110
-127 = 11111111


In dieser Darstellungsweise ist die "0" gleich zweimal vorhanden, einmal mit positivem und einmal mit negativem Vorzeichen. Somit können anstatt der 256 Zahlen nur 255 unterschiedliche Zahlen in einer 8-Bit Variablen gespeichert werden, da "-0" ja gleich "+0" ist. Neben der Verschwendung von Speicherplatz führt das Vorhandensein von zweimal "0" bei Rechenoperationen zu Komplikationen, wie wir in späteren Kapiteln sehen werden. Daher hat sich eine etwas andere Form der Darstellung negativer Zahlen durchgesetzt.

Zweierkomplement

In der digitalen Welt hat sich eine, auf den ersten Blick kompliziertere Darstellungsweise vorzeichenbehafteter Zahlen etabliert. Auch bei dieser wird das höchstwertige Bit als Vorzeichen interpretiert und die positiven Zahlen werden analog zu obigem Beispiel dargestellt. Bis hin zu +0 ergeben sich keine Unterschiede.
Negative Zahlwerte müssen allerdings über 3 Schritte vom Dezimal ins Dualsystem errechnet werden:

(1) Vorzeichen ignorieren und ins Dualsystem umrechnen.
(2) Invertieren.
(3) Eins addieren

Als Beispiel errechnen wir die Dualzahl für die Dezimalzahl -53:
(1) 00110101
(2) 11001010
(3) 11001010 + 00000001 = 1101011

Die Zahlenreihe lautet mit dieser Rechenvorschrift:
+127 = 01111111
+126 = 01111110
+125 = 01111101
+124 = 01111100
...
...
  +3 = 00000011
  +2 = 00000010
  +1 = 00000001
  +0 = 00000000
  -1 = 11111111
  -2 = 11111110
  -3 = 11111101
  -4 = 11111100
  -5 = 10111011
...
...
-125 = 10000011
-126 = 10000010
-127 = 10000001
-128 = 10000000


Auch bei der Zahlendarstellung im Zweierkompliment ist eine negative Zahl an der "1" als höchstwertigem Bit zu erkennen. Die dezimale "0" ist somit den positiven Zahlen zuzurechnen. Als Wertebereich ergibt sich der folgende Zusammenhang:
-2(n-1) bis 2(n-1) - 1

für eine 8-Bit Zahl mit Vorzeichen ergibt sich somit:
-28-1 bis 28-1-1 = -128 bis +127






Du findest diese Seite klasse?

Gummibärchen als Nervennahrung beim Programmieren und der Betrieb dieses Servers verschlingen mein Geld.
Helft mit einer Motivationsspritze, dieses Projekt am Laufen zu halten.

Klick hier oder scan den QR Code, um eine Spende zu überweisen.



Vielen Dank!

Fragen? Anregungen? Fehler gefunden?
Kontakt per E-mail: question@h1i1.de