2010-07-06 13 views
6

Jeśli 32-bitowy procesor rzeczywiście ma tylko 32 bity, to w jaki sposób operacje matematyczne mogą działać na liczbach 64-bitowych? Na przykład:W jaki sposób osiąga się 64-bitową matematykę na 32-bitowym komputerze?

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

Zgodnie z MSDN, długi w C# jest podpisana liczba 64-bitowa: http://msdn.microsoft.com/en-us/library/ctetwysk(VS.71).aspx

Jak to się stało, że 32-bitowy Intel Mikroprocesor może wykonać kod, jak wyżej, bez uzyskiwania przepełnienie?

Odpowiedz

3

Używają bitu nośnego do dodawania i odejmowania. Asembler ops dla "add with carry" i "subtract with carry" (lub "zapożycz") może być użyty do arbitralnego dodawania i odejmowania dokładnej długości bitowej o rozszerzonej precyzji.

W przypadku zwielokrotnienia, jeśli tylko wynik 32-bitowy jest mnożony, można podzielić go na 16-bitowe pary wartości i pomnożyć, a następnie przesunąć i dodać (przy przenoszeniu), aby uzyskać pełny 64-bitowy wynik z 32 -bituj wielokrotnie. Zasadniczo, wykonanie wersji z długą ręką (dowolne dwa 16-bitowe mnożenia mieszczące się w 32-bitowym wyniku) może być użyte do wygenerowania dowolnych mnożników długości bitów przy użyciu bardziej ograniczonej precyzji.

FWIW, 32-bitowa instrukcja Intel "mul" asymu "mul" może dać 64-bitowy wynik w EDX: EAX, dzięki czemu można faktycznie robić mnożenia w 32-bitowych porcjach (z wartościami 64-bitowymi do dodania) zamiast 16 -bitowe porcje (z 32-bitowymi wartościami do przesunięcia i dodania).

0

Nawet 32-bitowe procesory często zawierały 64-bitową jednostkę zmiennoprzecinkową, ale dane mogły być przesyłane tylko 32-bitowo.

Jednak ogólnie rzecz biorąc, 64-bitowy zmiennoprzecinkowy może zostać osiągnięty, nawet jeśli procesor bazowy obsługuje tylko 8-bitowe operacje na liczbach całkowitych. Jednak kompilator lub programista musiałby wstawić wystarczający kod w celu zwirtualizowania efektu.