Frage

In einem TC ++ Kompilierer, die Binärdarstellung von 5 ist (00000000000000101) . Ich weiß, dass negative Zahlen als 2-Komplement gespeichert werden, so dass -5 in binär (111111111111011) . Die höchstwertige Bit (Vorzeichenbit) ist 1, das sagt, dass es eine negative Zahl ist.

Wie funktioniert der Compiler weiß, dass es ist -5 ? Wenn wir den binären Wert oben angegebenen (111111111111011) als Zahl ohne Vorzeichen interpretieren, wird es ganz anders ausfallen?

Auch, warum ist die 1 Kompliment von 5 6 (1111111111111010)

War es hilfreich?

Lösung

Der Compiler weiß nicht, . Wenn Sie -5 gießen unsigned int Sie 32763 bekommen.

Andere Tipps

Der Compiler weiß, weil dies die Konvention der CPU nativ verwendet ist. Der Computer verfügt über eine CPU, die negativen Zahlen in Zweierkomplementnotation speichert, so dass der Compiler folgt Anzug. Wenn Ihre CPU Einerkomplement Notation unterstützt, würde der Compiler, dass verwenden (wie es der Fall mit IEEE-Floats ist, nebenbei bemerkt).

Der Wikipedia-Artikel über das Thema wird erläutert, wie Zweierkomplement Notation funktioniert.

Der Prozessor implementiert und ohne Vorzeichen Anweisungen, die unterschiedlich auf der binären Zahlendarstellung arbeiten werden. Der Compiler weiß, welche diese Anweisungen auf dem Typ der Operanden beteiligt auszusenden Basis (das heißt int gegen unsigned int).

Der Compiler muss nicht wissen, ob eine Zahl negativ ist oder nicht, gibt es einfach die richtige Maschine oder Zwischensprachanweisungen für die betroffenen Arten. Der Prozessor oder die Laufzeit der Umsetzung dieser Anweisungen der Regel nicht viel Pflege, wenn die Zahl negativ ist oder auch nicht, wie die Formulierung von Zweierkomplementarithmetik so ist, dass es das gleiche für positive oder negative Zahlen ist (in der Tat, dies ist der Haupt Vorteil der Komplement-Arithmetik zwei). Was würde müssen wissen, ob eine Zahl negativ ist so etwas wie printf() sein würde und wie Andrew Jaffe darauf hingewiesen, die MSBit gesetzt wird, ist bezeichnend für eine negative Zahl in Zweier-Komplement.

Das erste Bit wird nur für negative Zahlen

(es ist das Vorzeichenbit genannt)

Detaillierte Informationen finden Sie hier

Die kewl Komplement von zwei ist, dass die Maschinensprache hinzufügen und Anweisungen subtrahiert alles ignorieren und nur binäre Arithmetik zu tun und es funktioniert ...

d., -3 + 4

in Binary 2-Komplement, ist

   1111 1111 1111 1101   (-3)
+  0000 0000 0000 0100   ( 4)
   -------------------
   0000 0000 0000 0001   ( 1)

Lassen Sie uns ein Beispiel geben: wir haben zwei Zahlen in zwei Bytes in binär: A = 10010111 B = 00100110 (Beachten Sie, dass die Maschine nicht weiß, das Konzept des mit oder ohne Vorzeichen in dieser Ebene)

Wenn Sie jetzt sagen, „add“ diese beiden, was macht die Maschine? es fügt einfach:

R = 10111101 (und Bit-Übertrag: 1)

jetzt, wir -wie Compiler- Notwendigkeit, den Betrieb zu interpretieren. wir haben zwei Möglichkeiten: die Zahlen können mit oder ohne Vorzeichen werden

.

1- unsigned Fall: in c sind die Zahlen des Typs "unsigned char" und die Werte sind 151 und 38 und das Ergebnis ist 189. Dies ist trivial

.

2 - unterzeichnet Fall: wir, der Compiler, interpretieren die Zahlen entsprechend ihrer msb und die erste Zahl ist -105 und das zweite ist noch 38 so -105 + 38 = -67. Aber -67 ist 10111101. Aber das ist, was wir haben bereits im Ergebnis (R)! Das Ergebnis ist das gleiche, der einzige Unterschied ist, wie der Compiler interpretiert.

Die Schlussfolgerung ist, dass, egal wie wir die Zahlen betrachten, die Maschine auf die Zahlen die gleiche Operation der Fall ist. Aber der Compiler wird die Ergebnisse der wiederum interpretieren.

Beachten Sie, dass es nicht die Maschine, die das Konzept der 2er-Komplement-weiß . es fügt nur zwei Zahlen, ohne den Inhalt zu kümmern. Der Compiler , dann schaut auf das Vorzeichenbit und entscheidet .

Wenn es um die Subtraktion kommt, diesmal wieder, die Operation ist einzigartig: Nehmen Sie 2-Komplement der zweiten Reihe und die beiden hinzuzufügen.

Wenn die Zahl als signierte Datentyp deklariert wird (und nicht auf einen Typ ohne Vorzeichen gegossen Typ), dann wird der Compiler weiß, dass, wenn das Vorzeichenbit 1 ist, dann ist es eine negative Zahl. anstelle von 1-en Was, warum 2er-Komplement-Ergänzung verwendet wird, wollen Sie nicht einen Wert von -0 bis in der Lage sein, die 1-Komplement erlauben würden Sie zu tun, so erfanden sie 2er- Komplement das zu beheben.

Es ist genau das signifikanteste Bit - wenn Sie eine Nummer kennen signiert ist, dann, wenn das MSB = 1 die Compiler (und die Laufzeit!) Weiß es als negativ zu interpretieren. Aus diesem Grunde ist c-ähnlichen Sprachen beiden ganzen Zahlen (positiv und negativ) und ganzen Zahlen ohne Vorzeichen - in diesem Fall, dass Sie sie alle als positiv interpretieren. Daher ist ein Byte mit Vorzeichen geht von -128 bis 127, sondern Byte ohne Vorzeichen von 0 bis 255.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top