Linux C Programming Tutorial Teil 15 – 2’s Ergänzungs- und Negativzahlen

Bislang haben wir in dieser laufenden C-Programmier-Tutorialreihe einige Konzepte diskutiert, aber ein grundlegendes verpasst. Es geht um negative Zahlen. Ja, obwohl wir in einem unserer ersten Tutorials kurz signierte vs. unsignierte Variablen erwähnt haben, haben wir nicht darüber gesprochen, wie negative Zahlen im Speicher gespeichert werden.

Nun, das ist genau das, was in diesem Tutorial besprochen wird. Beginnen wir also ohne weiteres mit der Diskussion.

2er-Komplement

Bevor wir mit der Erklärung zur Darstellung negativer Zahlen im Speicher beginnen, ist es wichtig, dass wir das Konzept des 1er- und 2er-Komplements kennen, die beide binäre Operationen sind.

Nehmen wir ein sehr einfaches Beispiel. Angenommen, Sie haben eine 4-Byte-Ganzzahl ‚a‘ mit dem Dezimalwert 15. Dann ist hier, wie es im binären Formgedächtnis dargestellt wird:

00000000 00000000 00000000 00001111

Um nun das Komplement zu berechnen, invertieren Sie einfach alle Bits. Es folgt also die 1er-Komplementdarstellung von 15:

11111111 11111111 11111111 11110000

Wenn Sie nun 1 zur obigen binären Darstellung hinzufügen, erhalten Sie das 2er-Komplement.

11111111 11111111 11111111 11110001

Die obige Darstellung ist also das Zweierkomplement von 15.

Negative Zahlen

Nun, einige von euch müssen sich überlegen, warum wir die Ergänzung von 1 und 2 diskutiert haben? Nun, die Antwort liegt darin, dass die binäre Darstellung einer negativen Zahl durch das 2er-Komplement berechnet wird.

Kaum zu glauben? Hier ist der Beweis:

Das im vorherigen Abschnitt berechnete 2er-Komplement kann hexadezimal als 0xFFFFFFFFFF1 dargestellt werden. Nun, lassen Sie uns sehen, was dieser Wert in dezimaler Form durch ein C-Programm ist.

Hier ist der Code:

#include <stdio.h>

int main()
{
int a = 0xFFFFFFF1;
printf(„a = %d“, a);

return 0;
}

Und das Folgende ist die Ausgabe:

a = -15

Glaubst du es jetzt? Wir begannen mit einer Zahl’15‘, berechneten ihr 2er-Komplement, und als wir den Komplementwert der beiden wieder in Dezimalwert umwandelten, fanden wir heraus, dass es -15 ist.

Weiter geht’s, lassen Sie uns nun den Code leicht optimieren, um sicherzustellen, dass der printf-Aufruf den Wert der Variablen’a‘ liest. wie bisher eine ganze Zahl ohne Vorzeichen.

#include <stdio.h>

int main()
{
int a = 0xFFFFFFF1;
printf(„a = %u“, a);

return 0;
}

Hier ist jetzt die Ausgabe:

a = 4294967281

Ups, die Ausgabe hat sich geändert, und jetzt ist es ein riesiger positiver Wert. Aber warum ist das passiert? Ist 0xFFFFFFFFFF1 nicht das 2er-Komplement von 15, wie wir es bereits gesehen haben?

Ja, 0xFFFFFFFFFF1 ist ein Zweierkomplement von 15, aber wenn man es nicht aus dieser Perspektive betrachtet, ist es auch ein Normalwert (4294967281). Der Unterschied liegt in der Art und Weise, wie sie gelesen wird. Wenn es als vorzeichenbehaftete ganze Zahl gelesen wird (durch %d in printf), sehen Sie die Ausgabe als -15, aber wenn es als vorzeichenlose ganze Zahl gelesen wird (durch %u in printf), sehen Sie die Ausgabe als 4294967281.

Als Faustregel bei vorzeichenbehafteten Variablen (die sowohl negative als auch positive Werte behandeln) ist zu beachten, dass die binäre Darstellung von negativen Zahlen immer ‚1‘ als linkes Bit hat, während bei positiven Zahlen das betreffende Bit immer 0 ist.

Schließlich ist zu beachten, dass Sie auch die Zweierkomplementdarstellung umkehren können, um das positive Gegenstück zu erhalten. Als Beispiel nehmen wir noch einmal den Wert 0xFFFFFFFFFF1, der die hexadezimale Darstellung von -15 ist. Es wird in binärer Form dargestellt als:

11111111 11111111 11111111 11110001

Nun, um sein positives Gegenstück zu erhalten, führen Sie einfach noch einmal ein 2er-Komplement durch. Das bedeutet, dass du zuerst das Komplement eines 1ers machst:

00000000 00000000 00000000 00001110

Und dann fügen Sie 1 hinzu

00000000 00000000 00000000 00001111

Wenn Sie dies nun konvertieren, erhalten Sie den Wert 15 in dezimaler Form.

Fazit

Ich hoffe, dass dieses Tutorial Ihnen geholfen hat, das Konzept der negativen Zahlen im Zusammenhang damit zu verstehen, wie sie im Gedächtnis dargestellt werden. Ich schlage vor, dass Sie die Beispiele, die wir in diesem Tutorial verwendet haben, ausprobieren, und falls Sie auf ein Problem stoßen, oder wenn Sie Zweifel oder Fragen haben, lassen Sie uns einen Kommentar unten.

Das könnte Dich auch interessieren …