长期在32位机器上实现

根据c99标准, long long大小应至少为64位。 如何在32位机器中实现(例如,2个long long整数的加法或乘法)。 另外,C ++中long long的等价物是什么。

在IA32架构中,使用两个32位寄存器(eax和edx)实现64位整数。

C ++存在特定于平台的等价物,您可以在可用的情况下使用stdint.h标头(boost为您提供一个 )。

C ++中的等价物也很长。 它不是标准所要求的,但大多数编译器都支持它,因为它非常有用。

它是如何实现的? 大多数计算机体系结构已经内置了对多字加法和减法的支持。 它们不直接执行64位添加,但使用进位标志和一个特殊的add-instruction来构建一个64位加法,来自两个32位加法。

减法也存在相同的扩展(在这些情况下,进位称为借位)。

在没有进位标志帮助的情况下,可以通过较小的乘法来构建长字乘法和除法。 有时简单地一点一点地进行操作会更快。

有些架构根本没有任何标志(一些DSP芯片和简单的微型)。 在这些架构上,必须通过逻辑运算来检测溢出。 这些机器上的多字算术往往很慢。

正如大家所说的,通常只需将两个32位整数一起使用即可实现64位整数。 然后使用聪明的代码生成来跟踪进位和/或借位以跟踪溢出,并相应地进行调整。

这当然使得这种算法在代码空间和执行时间方面比为具有64位操作的本机支持的体系结构编译的相同代码更昂贵。

如果你关心比特尺寸,你应该使用

 #include  int32_t n; 

和朋友。 这也适用于C ++。

32位机器上的64位数字按照您的想法实现4个额外字节。 因此,您可以通过执行以下操作来实现自己的64位数据类型:

 struct my_64bit_integer { uint32_t low; uint32_t high; }; 

你当然必须自己实现数学运算符。

stdint.h中有一个int64_t,它带有我的GCC版本,而在Microsoft Visual C ++中,你也有一个__int64类型。

下一个C ++标准(到2009年,或者可能是2010年),将包含“long long”类型。 如前所述,它已经被普遍使用。

尽管计算机始终支持多个精度操作,但实现取决于编译器编写器。 有些语言,如Python和Common Lisp,需要支持无限精度的整数。 很久以前,我为计算机(Z80)编写了64位乘法和除法程序,可以管理16位加法和减法,完全没有硬件乘法。

查看特定编译器上如何实现操作的最简单方法可能是编写代码示例并检查汇编器输出,该输出可以从我使用过的所有主要编译器中获得。