2010-07-06 1 views
6

Wenn ein 32-Bit-Prozessor wirklich nur 32 Bit lang ist, wie können dann mathematische Operationen an 64-Bit-Zahlen arbeiten? Zum Beispiel:Wie erfolgt die 64-Bit-Mathematik auf einem 32-Bit-Rechner?

long lngTemp1 = 123456789123; 
long lngTemp2 = lngTemp1 * 123; 

Laut MSDN, ein lange in C# ist eine signierte 64-Bit-Zahl: http://msdn.microsoft.com/en-us/library/ctetwysk(VS.71).aspx

Wie es ist, dass eine 32-Bit-Intel-Mikroprozessor-Code ausführen kann, wie die oben, ohne sie ein Überlauf?

Antwort

3

Sie verwenden das Übertragsbit zum Addieren und Subtrahieren. Die Assembler-Operationen für "add with carry" und "subtract with carry" (oder "borrow") können für die Addition und Subtraktion extendierter Bits mit beliebiger Bitlänge verwendet werden. Wenn Sie nur ein 32-Bit-Ergebnis von Multiplizieren haben, können Sie es in 16-Bit-Wertepaare zerlegen und multiplizieren und dann verschieben und addieren (mit Übertrag), um ein vollständiges 64-Bit-Ergebnis von 32 zu erhalten -Bit multiplizieren. Grundsätzlich kann das Ausführen der Langhand-Version (beliebige zwei 16-Bit-Multiplikationen passen in ein 32-Bit-Ergebnis) verwendet werden, um beliebige Bitlängen-Multiplikationen unter Verwendung einer eingeschränkteren Genauigkeit zu erzeugen.

FWIW, die 32-Bit-ASM-Anweisung "mul" kann ein 64-Bit-Ergebnis in EDX: EAX setzen, sodass Sie tatsächlich in 32-Bit-Blöcken multiplizieren (mit hinzuzufügenden 64-Bit-Werten) statt 16 -Bit-Chunks (mit 32-Bit-Werten zum Verschieben und Hinzufügen).

0

Sogar 32-Bit-Prozessoren kamen oft mit einer 64-Bit-Gleitkommaeinheit - aber die Daten konnten nur in 32-Bit-Blöcken gleichzeitig übertragen werden.

Allgemeiner jedoch könnte 64-Bit Gleitkomma auch erreicht werden, wenn der zugrunde liegende Prozessor nur 8-Bit-Integer-Operationen ermöglicht. Der Compiler oder Programmierer müsste jedoch ausreichend Code einfügen, um den Effekt zu virtualisieren.

Verwandte Themen