【发布时间】:2008-12-01 09:30:18
【问题描述】:
根据 c99 标准,long long 的大小应至少为 64 位。这是如何在 32 位机器中实现的(例如 2 long longs 的加法或乘法)。另外,C++ 中long long 的等价物是什么。
【问题讨论】:
-
8 位和 16 位机器也设法处理大于其“处理器位数”的变量。历史已经回答了许多问题。
根据 c99 标准,long long 的大小应至少为 64 位。这是如何在 32 位机器中实现的(例如 2 long longs 的加法或乘法)。另外,C++ 中long long 的等价物是什么。
【问题讨论】:
C++ 中的等价物也很长。它不是标准要求的,但大多数编译器都支持它,因为它非常有用。
它是如何实现的?大多数计算机体系结构已经内置了对多字加法和减法的支持。他们不直接进行 64 位加法,而是使用进位标志和特殊的加法指令从两个 32 位加法构建一个 64 位加法。
减法也存在相同的扩展(在这些情况下进位称为借位)。
长字乘法和除法可以从较小的乘法中构建,而无需进位标志的帮助。有时只是一点一点地进行操作会更快。
有些架构根本没有任何标志(一些 DSP 芯片和简单的微控制器)。在这些架构上,溢出必须通过逻辑操作来检测。这些机器上的多字算术往往很慢。
【讨论】:
在 IA32 架构上,64 位整数是使用两个 32 位寄存器(eax 和 edx)实现的。
C++ 有特定于平台的等效项,您可以在可用的情况下使用 stdint.h 标头(boost 为您提供one)。
【讨论】:
正如大家所说,一个 64 位整数通常通过简单地使用两个 32 位整数来实现。然后使用智能代码生成来跟踪carry and/or borrow 位以跟踪溢出,并进行相应调整。
与为原生支持 64 位操作的架构编译的相同代码相比,这当然使此类算法在代码空间和执行时间方面的成本更高。
【讨论】:
如果你关心位大小,你应该使用
#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 类型。
【讨论】:
下一个 C++ 标准(2009 年或 2010 年到期)将包含“long long”类型。如前所述,它已经很普遍了。
实现由编译器编写者决定,尽管计算机一直支持多精度运算。某些语言,如 Python 和 Common Lisp,需要支持不定精度整数。很久以前,我为一台计算机(Z80)编写了 64 位乘法和除法例程,它可以管理 16 位加法和减法,根本不需要硬件乘法。
要查看特定编译器上的操作是如何实现的,最简单的方法可能是编写代码示例并检查汇编器输出,这些输出可从我使用过的所有主要编译器中获得。
【讨论】: