Wie unterstützt ein 32-Bit-Prozessor 64-Bit-Ganzzahlen?

7

In C ++ können Sie eine int verwenden, die normalerweise 4 Bytes beträgt. Eine long long Ganzzahl ist normalerweise 8 Bytes. Wenn die CPU 32 Bit wäre, würde das nicht auf 32 Bit beschränkt sein? Wie kann ich eine long long Ganzzahl verwenden, wenn sie 64 Bits nicht unterstützt? Kann das Alu größere ganze Zahlen oder etwas hinzufügen?

    
user3452725 13.04.2014, 02:29
quelle

5 Antworten

15

Die meisten Prozessoren enthalten ein Übertrags-Flag und ein Überlauf-Flag, um Operationen an Ganzzahlen mit mehreren Wörtern zu unterstützen. Das Übertrags-Flag wird für vorzeichenlose Berechnungen und das Überlauf-Flag für vorzeichenbehaftete Berechnungen verwendet.

Zum Beispiel könnten Sie auf einem x86 zwei unsignierte 64-Bit-Zahlen (die wir annehmen, sind in EDX: EAX und EBX: ECX) etwas wie folgt hinzufügen:

%Vor%

Es ist möglich, diese Art von Dingen auch in höheren Programmiersprachen wie C ++ zu implementieren, aber sie brauchen viel weniger, um sie zu unterstützen. Daher endet der Code in der Regel wesentlich langsamer als in Assembler.

Die meisten Operationen sind grundsätzlich seriell. Wenn Sie auf der binären Ebene addieren, nehmen Sie zwei Eingabebits und erzeugen ein Ergebnisbit und ein Übertragsbit. Das Übertragsbit wird dann als eine Eingabe verwendet, wenn das nächstniedrigstwertige Bit usw. über das Wort hinzugefügt wird (bekannt als "Welligkeitsaddierer", weil der Zusatz über das Wort "kräuselt").

Es gibt ausgeklügeltere Möglichkeiten, Additionen durchzuführen, die diese Abhängigkeit zwischen einem Bit und einem anderen reduzieren können, wenn eine bestimmte Addition keine Abhängigkeit erzeugt, und die aktuelle Hardware verwendet solche Dinge.

Im schlimmsten Fall jedoch wird das Hinzufügen von 1 zu einer Zahl, die bereits die größte unterstützte Wortgröße ist, dazu führen, dass ein Übertrag von jedem Bit zum nächsten über das ganze Wort hinweg generiert wird.

Das bedeutet, dass (zumindest teilweise) die Wortbreite, die eine CPU unterstützt, der maximalen Taktgeschwindigkeit, mit der sie laufen kann, Grenzen setzt. Wenn jemand dringend genug wollte, konnte er eine CPU bauen, die mit beispielsweise 1024-Bit-Operanden arbeitete. Wenn sie das tun würden, hätten sie zwei Möglichkeiten: entweder mit einer niedrigeren Taktfrequenz oder mit mehreren Takten, um ein einzelnes Paar von Operanden hinzuzufügen.

Beachten Sie auch, dass Sie, wenn Sie solche Operanden erweitern, mehr Speicher benötigen (z. B. einen größeren Cache), um so viele Operanden zu speichern, mehr Gatter, um jede einzelne Operation auszuführen, und so weiter.

Bei gleicher Technologie könnten Sie also einen 64-Bit-Prozessor mit 4 GHz und etwa 4 Megabyte Cache oder einen 1024-Bit-Prozessor mit 250 MHz und vielleicht 2 Megabyte haben von Cache.

Letzteres wäre wahrscheinlich ein win , wenn die meisten Ihrer Arbeiten auf 1024-Bit (oder größeren) Operanden wären. Die meisten Leute tun jedoch nicht sehr oft auf 1024-Bit-Operanden Mathematik. Tatsächlich sind 64-Bit-Nummern für die meisten Zwecke groß genug. Daher würde die Unterstützung breiterer Operanden für die meisten Menschen wahrscheinlich die meiste Zeit ein Nettoverlust darstellen.

    
Jerry Coffin 13.04.2014, 02:34
quelle
4

Im Grunde ist die Addition der normalerweise einzelnen Befehle in zwei (oder drei) Schritte unterteilt:

1) Fügen Sie die 32 Bits niedriger Ordnung hinzu, indem Sie die übliche Anweisung addieren. Beachten Sie, ob dieser Zusatz ein "Ausführen" -Bit erzeugen würde (das heißt, wenn das Ergebnis tatsächlich 33 Bit erfordern würde).

2) Fügen Sie die 32 Bits höherer Ordnung auf die gleiche Weise hinzu. Wenn es einen Übertrag von den Bits niedrigerer Ordnung gab, setze das Übertrag-In-Bit hier (oder addiere alternativ eins zu dem Ergebnis nach dem Hinzufügen).

    
Drew Hall 13.04.2014 02:35
quelle
4

Es ist möglich, beliebig breite Integer (durch Software-Implementierung) zu unterstützen, auch wenn die zugrunde liegende Hardware nur weniger Bits direkt unterstützt. Wenn eine 32-Bit-Ganzzahl zu einer anderen 32-Bit-Ganzzahl hinzugefügt wird, könnte sie überlaufen und 33 Bits benötigen, um die Antwort zu speichern. Die Software kann erkennen, dass dieser Überlauf aufgetreten ist (der Prozessor hat ein Übertrags-Flag , das überprüft werden kann) und ein weiteres 32-Bit-Wort Dies bedeutet, dass die höchstwertigen Bits der 64-Bit-Zahl um 1 erhöht werden können.

Hier ist ein wenig mehr auf der Trage Flagge und wie es benutzt wird.

    
Steve 13.04.2014 02:32
quelle
3

Sie verwenden zwei Speicherplätze, um die Nummer zu speichern. Die Hälfte der Nummer wird an einem Speicherort im Speicher und die andere Hälfte im benachbarten Speicherort gespeichert.

    
Outsider 13.04.2014 02:31
quelle
0

Sie könnten auch in Betracht ziehen, dass wir in den Tagen der 8-Bit-CPUs mit 16 oder sogar 32 Bit großen Ganzzahlen zurechtgekommen sind. Es gibt nichts, das ein bestimmtes alu davon abhält, willkürliche Größennummern anders als Speicherraum zu behandeln, und schließlich nehme ich die Geduld des Benutzers an.

Smalltalk zum Beispiel hat seit dem ursprünglichen Dorados und Altos immer ganze Zahlen von beliebiger Länge geliefert - das bringt uns zurück bis 1970. Wollen Sie den genauen Wert von 963! - Mach es einfach. Es wird eine Weile dauern, es zu formatieren, um es zu drucken.

    
timrowledge 19.04.2014 03:57
quelle

Tags und Links