【问题标题】:How is 64-bit math accomplished on a 32-bit machine?64 位数学是如何在 32 位机器上完成的?
【发布时间】:2011-03-12 12:48:57
【问题描述】:

如果 32 位处理器确实只有 32 位长度,那么数学运算如何处理 64 位数字?例如:

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

根据 MSDN,C# 中的 long 是有符号的 64 位数字:http://msdn.microsoft.com/en-us/library/ctetwysk(VS.71).aspx

32 位 Intel 微处理器如何执行代码,如上述而不会溢出?

【问题讨论】:

    标签: c# types overflow long-integer


    【解决方案1】:

    他们使用进位位进行加减运算。 “进位加法”和“进位减法”(或“借位”)的汇编操作可用于任意位长扩展精度加减法。

    对于乘法,如果只有 32 位乘法结果,则可以将其分解为 16 位值对并相乘,然后移位和加法(带进位)以从 32- 得到完整的 64 位结果位相乘。基本上,执行长手版本(任何两个 16 位乘法都适合 32 位结果)可用于使用更有限的精度生成任意位长度的乘法。

    FWIW,英特尔 32 位 asm“mul”指令可以将 64 位结果放入 EDX:EAX,因此您实际上可以在 32 位块中进行乘法运算(要添加 64 位值)而不是 16-位块(需要移动和添加 32 位值)。

    【讨论】:

      【解决方案2】:

      x86 的 32 位指令集可用于 64 位运算,参见Extended Precision Multiplication

      【讨论】:

        【解决方案3】:

        即使是 32 位处理器也通常带有 64 位浮点单元 - 但数据一次只能以 32 位总线传输。

        然而,更一般地说,即使底层处理器只允许 8 位整数运算,也可以实现 64 位浮点。但是,编译器或程序员必须插入足够的代码才能虚拟化效果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 1970-01-01
          • 2011-08-08
          • 2011-04-09
          • 2011-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多