Mit einem rein mathematischen Hintergrund ist dies eine etwas mathematischere Einstellung für alle Interessierten.
Wenn wir mit einer 8-Bit-Ganzzahl mit und ohne Vorzeichen beginnen, haben wir im Grunde genommen die Ganzzahlen modulo 256, was Addition und Multiplikation betrifft, vorausgesetzt, das Zweierkomplement wird zur Darstellung negativer Ganzzahlen verwendet (und so macht es jeder moderne Prozessor). .
Wo sich die Dinge unterscheiden, gibt es zwei Stellen: eine ist Vergleichsoperationen. In gewisser Weise werden die Ganzzahlen modulo 256 am besten als ein Kreis von Zahlen betrachtet (wie dies die Ganzzahlen modulo 12 auf einem altmodischen analogen Zifferblatt tun). Um numerische Vergleiche (ist x <y) sinnvoll zu machen, mussten wir entscheiden, welche Zahlen kleiner als andere sind. Aus der Sicht des Mathematikers wollen wir die ganzen Zahlen modulo 256 irgendwie in die Menge aller ganzen Zahlen einbetten. Es liegt auf der Hand, die 8-Bit-Ganzzahl, deren Binärdarstellung aus Nullen besteht, auf die Ganzzahl 0 abzubilden. Wir können dann mit dem Abbilden anderer fortfahren, so dass '0 + 1' (das Ergebnis des Nullstellens eines Registers, sagen wir ax, und des Inkrementierens um eins, über 'inc ax') auf die Ganzzahl 1 geht und so weiter. Wir können dasselbe mit -1 machen, zum Beispiel '0-1' der ganzen Zahl -1 zuordnen und '0-1-1' auf die ganze Zahl -2. Wir müssen sicherstellen, dass diese Einbettung eine Funktion ist, und können daher keine einzelne 8-Bit-Ganzzahl auf zwei Ganzzahlen abbilden. Dies bedeutet, dass, wenn wir alle Zahlen in die Menge der Ganzzahlen abbilden, 0 zusammen mit einigen Ganzzahlen kleiner als 0 und einigen größer als 0 vorhanden sein wird bis zu welchem Minimum Sie wollen, von 0 bis -255). Dann können Sie 'x <y' als '0 <y - x' definieren.
Es gibt zwei häufige Anwendungsfälle, für die Hardware-Unterstützung sinnvoll ist: einer mit einer Ganzzahl ungleich Null, die größer als 0 ist, und einer mit einer Aufteilung von ungefähr 50/50 um 0. Alle anderen Möglichkeiten lassen sich leicht durch Übersetzen von Zahlen mit einem zusätzlichen 'add' emulieren und sub 'vor Operationen, und die Notwendigkeit für diese ist so selten, als ich mir kein explizites Beispiel in moderner Software vorstellen kann (da Sie nur mit einer größeren Mantisse arbeiten können, sagen wir 16 Bits).
Das andere Problem ist das Abbilden einer 8-Bit-Ganzzahl in den Raum von 16-Bit-Ganzzahlen. Geht -1 zu -1? Dies ist, was Sie wollen, wenn 0xFF -1 darstellen soll. In diesem Fall ist es sinnvoll, das Vorzeichen zu erweitern, damit 0xFF zu 0xFFFF wird. Wenn dagegen 0xFF für 255 stehen soll, soll es auf 255 und damit auf 0x00FF und nicht auf 0xFFFF abgebildet werden.
Dies ist auch der Unterschied zwischen der Verschiebung und der arithmetischen Verschiebung.
Letztendlich kommt es jedoch darauf an, dass ints in Software keine ganzen Zahlen sind, sondern Darstellungen in binärer Form, und nur einige können dargestellt werden. Beim Entwerfen von Hardware müssen Entscheidungen getroffen werden, welche Aufgaben in der Hardware von Haus aus zu erledigen sind. Da mit dem 2er-Komplement die Additions- und Multiplikationsoperationen identisch sind, ist es sinnvoll, negative ganze Zahlen auf diese Weise darzustellen. Dann ist es nur eine Frage der Operationen, die davon abhängen, welche ganzen Zahlen Ihre binären Darstellungen darstellen sollen.