在汇编语言中,通常有一条指令将两个操作数和一个进位相加。如果你想实现大整数加法,你只需添加没有进位的最低整数和下一个有进位的整数。在无法访问进位标志的 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/