Как 64-разрядная математика выполняется на 32-разрядной машине?

Если 32-разрядный процессор - действительно, действительно только 32 бита в длине, то, как математические операции могут работать над 64-разрядными числами? Например:

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

Согласно MSDN, длинным в C# является 64-разрядное число со знаком: http://msdn.microsoft.com/en-us/library/ctetwysk (По сравнению с 71) .aspx

Как получается, что 32-разрядный Intel Microprocessor может выполнить код, как вышеупомянутое, не получая переполнение?

8
задан Icemanind 6 July 2010 в 20:53
поделиться

3 ответа

Они используют бит переноса для сложения и вычитания. Операции ассемблера "сложение с переносом" и "вычитание с переносом" (или "заимствование") можно использовать для сложения и вычитания с расширенной точностью произвольной битовой длины.

Для умножения, если у вас есть только 32-битный результат умножения, вы можете разбить его на 16-битные пары значений и умножить, а затем сдвинуть и сложить (с переносом), чтобы получить полный 64-битный результат из 32-битного умножения. В принципе, длинноразрядная версия (любые два 16-битных умножения укладываются в 32-битный результат) может быть использована для генерации умножений произвольной битовой длины с более ограниченной точностью.

FWIW, инструкция Intel 32-bit asm "mul" может поместить 64-битный результат в EDX:EAX, так что вы можете выполнять умножение в 32-битных кусках (с 64-битными значениями для сложения), а не в 16-битных кусках (с 32-битными значениями для сдвига и сложения).

5
ответ дан 5 December 2019 в 23:13
поделиться

32-битный набор инструкций x86 может использоваться для 64-битной арифметики, см. Умножение с расширенной точностью.

0
ответ дан 5 December 2019 в 23:13
поделиться

Даже 32-битные процессоры часто поставлялись с 64-битным блоком с плавающей запятой - но данные могли передаваться по шине только в 32 битах за раз.

В более общем случае, однако, 64-битная плавающая точка может быть реализована, даже если основной процессор позволяет выполнять только 8-битные целочисленные операции. Однако компилятор или программист должен будет вставить достаточное количество кода, чтобы виртуализировать этот эффект.

0
ответ дан 5 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: