2010-07-06 4 views
6

Se un processore a 32 bit è, in realtà, solo 32 bit di lunghezza, come possono le operazioni matematiche lavorare su numeri a 64 bit? Per esempio:Come viene eseguita la matematica a 64 bit su una macchina a 32 bit?

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

Secondo MSDN, un lungo in C# è un firmato numero a 64 bit: http://msdn.microsoft.com/en-us/library/ctetwysk(VS.71).aspx

Come è possibile che a 32 bit Intel microprocessore in grado di eseguire il codice, come sopra senza ottenere un overflow?

risposta

3

Utilizzano il bit di trasporto per aggiungere e sottrarre. Le operazioni di assemblatore per "aggiungi con carry" e "sottrazione con carry" (o "borrow") possono essere utilizzate per l'addizione e la sottrazione di precisione estesa a lunghezza di bit arbitraria.

Per moltiplicare, se si ottiene un risultato a 32 bit da moltiplicare, è possibile suddividerlo in coppie di valori a 16 bit e moltiplicare e quindi spostare e aggiungere (con carry) per ottenere un risultato completo a 64 bit da 32 -bit moltiplicare. In pratica, è possibile utilizzare la versione a mano lunga (eventuali due moltiplicatori a 16 bit adattati a un risultato a 32 bit) per generare moltiplicatori di lunghezza bit arbitraria utilizzando una precisione più limitata.

FWIW, l'istruzione "mul" a 32 bit di Intel può mettere un risultato a 64 bit in EDX: EAX in modo che si possano effettivamente moltiplicare in blocchi a 32 bit (con valori a 64 bit da aggiungere) anziché 16 -bit pezzi (con valori a 32 bit per spostare e aggiungere).

0

Anche i processori a 32 bit venivano spesso con un'unità a virgola mobile a 64 bit, ma i dati potevano essere inviati solo a 32 bit alla volta.

Più in generale, tuttavia, il punto in virgola mobile a 64 bit può essere eseguito anche se il processore sottostante consente solo operazioni a 8 bit integer. Tuttavia, il compilatore o il programmatore dovrebbe inserire un codice sufficiente per virtualizzare l'effetto.