c++ - 没有进位标志的大整数加法

标签 c++ c addition arbitrary-precision carryflag

在汇编语言中,通常有一条指令将两个操作数和一个进位相加。如果你想实现大整数加法,你只需添加没有进位的最低整数和下一个有进位的整数。在无法访问进位标志的 C 或 C++ 中,我如何有效地做到这一点?它应该适用于多个编译器和架构,所以我不能简单地使用内联汇编等。

最佳答案

您可以使用“钉子”(GMP 中的一个术语):在表示数字时不要使用 uint64_t 的所有 64 位,而是只使用其中的 63 位,最高位为零。这样您就可以通过简单的位移来检测溢出。您甚至可能想要小于 63。

或者,您可以进行半字运算。如果您可以进行 64 位算术运算,则将您的数字表示为 uint32_t 的数组(或等效地,将 64 位字拆分为高位和低位 32 位 block )。那么,在对这些32位整数进行算术运算时,可以先提升到64位进行算术运算,再转换回来。这让您可以检测进位,如果您没有“乘法高”指令,它也适用于乘法。

如其他答案所示,您可以通过以下方式检测无符号加法中的溢出:

uint64_t sum = a + b;
uint64_t carry = sum < a;

顺便说一句,虽然在实践中这也适用于有符号算术,但您有两个问题:

  • 比较复杂
  • 从技术上讲,溢出有符号整数是未定义的行为

所以您通常最好坚持使用无符号数。

关于c++ - 没有进位标志的大整数加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10959725/

相关文章:

c++ - C++中的定义和数组

c - 找出当前平台上最大的原生整数类型

python - 创建一个包含五个数字的列表

c++ - std::string 的声明导致 OpenGL 出现段错误

c++ - 如何在 Windows XP 下从 Dev-c++ 中获取预处理代码?

c - 使用 Doxygen 的自动选项表生成器

c - 如何修复 "version ` GLIBC_2.1 4' not found"错误?

python - 如何在Python中添加/减去两个ctypes.c_double

javascript - 将 rel ="lightbox"添加到其中包含 .jpg 和 .gif 的链接

c++ - 如何在C++中打印字符数组