lassen Sie uns ein Beispiel geben: haben wir zwei Zahlen in zwei Bytes binär: A = 10010111 B = 00100110 (Beachten Sie, dass die Maschine das Konzept von signed oder unsigned in dieser Ebene nicht kennt)
jetzt, wenn Sie diese zwei "hinzufügen" sagen, was macht die Maschine? es fügt einfach:
R = 10111101 (und tragen Bit: 1)
jetzt, wir Compiler- Notwendigkeit zu interpretieren den Betrieb -wie. Wir haben zwei Möglichkeiten: Die Nummern können signiert oder nicht signiert sein.
1 unsigned case: in c sind die Zahlen vom Typ "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 die zweite ist immer noch 38. so -105 + 38 = -67. Aber -67 ist 10111101. Aber das haben wir schon im Ergebnis (R)! Das Ergebnis ist das gleiche, der einzige Unterschied ist, wie der Compiler es interpretiert.
Die Schlussfolgerung ist, dass, egal wie wir die Zahlen betrachten, die Maschine die gleiche Operation auf die Zahlen macht. Aber der Compiler wird die Ergebnisse wiederum interpretieren.
Beachten Sie, dass es nicht die Maschine ist, die das Konzept der 2er Komplement kennt. Es fügt nur zwei Zahlen hinzu, ohne den Inhalt zu beachten. Der Compiler schaut dann auf das Vorzeichenbit und entscheidet.
Wenn es zur Subtraktion kommt, ist dieses Mal wieder die Operation einzigartig: nehmen Sie das Zweierkomplement der zweiten Zahl und addieren Sie die zwei.
Ja, der Cast sagt dem Compiler, wie man Bits an einem bestimmten Speicherort interpretiert. Im Allgemeinen hat es seine eigene Vorstellung davon, was wo wo wohnt, aber eine Besetzung wirft einen Schraubenschlüssel in Dinge. – Dan
Nun, Sie müssen nicht einmal explizite Besetzung machen. – vartec
ja der Compiler macht nur die Mathematik. Wenn Sie von -5 bis unsigned int übergeben, ist das Ergebnis immer UINT_MAX + 1-5, unabhängig davon, ob Vorzeichen-Betrag/Zwei-Komplement/Eins-Komplement irrelevant ist. –