根据c99标准,long long
的大小应至少为64位。如何在32位机器中实现(例如,2 long long
s的加法或乘法)。另外,C ++中long long
的等价物是什么。
答案 0 :(得分:14)
C ++中的等价物也很长。它不是标准所要求的,但大多数编译器都支持它,因为它非常有用。
如何实施?大多数计算机体系结构已经内置了对多字加法和减法的支持。它们不直接进行64位添加,但使用进位标志和一个特殊的add-instruction来从两个32位的加法构建64位加法。
对于减法也存在相同的扩展(在这些情况下,进位称为借位)。
长字乘法和除法可以通过较小的乘法来构建,而无需携带标志的帮助。有时只是一点一点地进行操作会更快。
有些架构根本没有任何标志(某些DSP芯片和简单的微型)。在这些架构上,必须通过逻辑运算来检测溢出。这些机器上的多字运算往往很慢。
答案 1 :(得分:9)
在IA32架构上,使用两个32位寄存器(eax和edx)实现64位整数。
C ++有特定于平台的等价物,你可以使用stdint.h标题(boost为你提供one)。
答案 2 :(得分:4)
正如大家所说的,通常只需将两个32位整数一起使用即可实现64位整数。然后使用聪明的代码生成来跟踪carry and/or borrow位以跟踪溢出,并相应地进行调整。
这当然使得这种算法在代码空间和执行时间方面比为具有64位操作的本机支持的体系结构编译的代码更加昂贵。
答案 3 :(得分:2)
如果你关心比特大小,你应该使用
#include <stdint.h>
int32_t n;
和朋友们。这也适用于C ++。
32位机器上的64位数字按您的意愿实现, 4个额外字节。因此,您可以实现自己的64位 通过这样的方式实现数据类型:
struct my_64bit_integer {
uint32_t low;
uint32_t high;
};
你当然必须自己实施数学运算。
我的GCC版本附带的stdint.h中有一个int64_t, 在Microsoft Visual C ++中,您也有__int64类型。
答案 4 :(得分:2)
下一个C ++标准(2009年到期,或者可能是2010年),将包含“long long”类型。如前所述,它已经被普遍使用。
虽然计算机始终支持多个精度操作,但实现取决于编译器编写器。有些语言,如Python和Common Lisp,需要支持无限精度的整数。很久以前,我为一台计算机(Z80)编写了64位乘法和除法程序,可以管理16位加法和减法,完全没有硬件乘法。
在您的特定编译器上查看操作如何实现的最简单方法可能是编写代码示例并检查汇编器输出,该输出可以从我使用的所有主要编译器中获得。