GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux C Programming Tutorial Part 15 - 2s Komplement und negative Zahlen

Bis jetzt haben wir in dieser fortlaufenden C-Programmier-Tutorial-Reihe einige Konzepte besprochen, aber ein grundlegendes übersehen. Es geht um negative Zahlen. Ja, obwohl wir in einem unserer ersten Tutorials kurz vorzeichenbehaftete und vorzeichenlose Variablen erwähnt haben, haben wir nicht wirklich darüber gesprochen, wie negative Zahlen im Speicher gespeichert werden.

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

2er-Komplement

Bevor wir mit der Erläuterung der Darstellung negativer Zahlen im Speicher beginnen, ist es wichtig, dass wir das Konzept des 1er- und 2er-Komplements kennen, die beide Operationen auf binärer Ebene sind.

Nehmen wir ein ganz einfaches Beispiel. Angenommen, Sie haben eine 4-Byte-Ganzzahl 'a' mit dem Dezimalwert 15. Dann wird sie im Speicher in binärer Form folgendermaßen dargestellt:

00000000 00000000 00000000 00001111

Um nun das Einerkomplement zu berechnen, invertieren Sie einfach alle Bits. Das Folgende ist also die Darstellung des 1er-Komplements von 15:

11111111 11111111 11111111 11110000

Wenn Sie nun 1 zu der 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 Ihnen müssen sich fragen, warum wir das 1er- und 2er-Komplement besprochen haben? Nun, die Antwort liegt in der Tatsache, dass die binäre Darstellung einer negativen Zahl durch das Zweierkomplement berechnet wird.

Kaum zu glauben? Hier ist der Beweis:

Das 2er-Komplement, das wir im vorherigen Abschnitt berechnet haben, kann in hexadezimaler Form als 0xFFFFFFF1 dargestellt werden. Lassen Sie uns nun mit einem C-Programm sehen, was dieser Wert in Dezimalform 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

Glauben Sie es jetzt? Wir haben mit einer Zahl „15“ begonnen, ihr Zweierkomplement berechnet, und als wir den Zweierkomplementwert erneut in Dezimalzahlen umgewandelt haben, haben wir herausgefunden, dass es -15 ist.

Lassen Sie uns nun den Code leicht anpassen, um sicherzustellen, dass der printf-Aufruf den Wert der Variablen 'a' als wie eine Ganzzahl ohne Vorzeichen.

#include <stdio.h>

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

return 0;
}

Hier ist jetzt die Ausgabe:

a = 4294967281

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

Ja, 0xFFFFFFF1 ist das Zweierkomplement von 15, aber wenn Sie es nicht aus dieser Perspektive betrachten, ist es auch ein normaler Wert (4294967281). Der Unterschied liegt darin, wie es gelesen wird. Wenn es als Ganzzahl mit Vorzeichen gelesen wird (durch %d in printf), sehen Sie die Ausgabe als -15, aber wenn es als Ganzzahl ohne Vorzeichen gelesen wird (durch %u in printf), sehen Sie die Ausgabe als 4294967281.

Als Faustregel für vorzeichenbehaftete Variablen (die sowohl mit negativen als auch mit positiven Werten umgehen) sollten Sie bedenken, dass die binäre Darstellung negativer Zahlen immer '1' als ganz linkes Bit hat, während bei positiven Zahlen immer das fragliche Bit ist 0.  

Beachten Sie schließlich, dass Sie auch die Zweierkomplementdarstellung umkehren können, um ihr positives Gegenstück zu erhalten. Nehmen wir als Beispiel wieder den 0xFFFFFFF1-Wert, der eine Hexadezimaldarstellung von -15 ist. Es wird in binärer Form dargestellt als:

11111111 11111111 11111111 11110001

Um nun sein positives Gegenstück zu erhalten, führen Sie einfach wieder ein Zweierkomplement aus. Das heißt, machen Sie zuerst ein 1er-Komplement:

00000000 00000000 00000000 00001110

Und dann 1 hinzufügen

00000000 00000000 00000000 00001111

Wenn Sie dies jetzt umwandeln, erhalten Sie den Wert 15 in Dezimalform.

Schlussfolgerung

Ich hoffe, dieses Tutorial hat Ihnen geholfen, das Konzept negativer Zahlen im Kontext ihrer Darstellung im Gedächtnis zu verstehen. Ich schlage vor, Sie probieren die Beispiele aus, die wir in diesem Tutorial verwendet haben, und falls Sie auf ein Problem stoßen oder Zweifel oder Fragen haben, schreiben Sie uns unten einen Kommentar.


Linux
  1. So vergleichen Sie Zahlen und Zeichenfolgen im Linux-Shell-Skript

  2. Linux nice and renice Command Tutorial (7 Beispiele)

  3. C-Programmier-Tutorial Teil 5 - Zeichenvariablen

  4. Linux C-Programmier-Tutorial Teil 10 - Variable Gültigkeitsbereiche

  5. Linux C-Programmier-Tutorial Teil 9:Strings

5 interessante Kommandozeilen-Tipps und Tricks in Linux – Teil 1

Wie man Textdateien unter Linux vergleicht und zusammenführt (Teil 2)

Linux C Programming Tutorial Teil 11 - Arithmetische, relationale und logische Operatoren

Linux C Programming Tutorial Teil 18:Rekursive Funktionen

So installieren und verwenden Sie KompoZer unter Linux - Tutorial

Diskussion über Windows, Linux und cPanel VPS – Teil II