在汇编语言中,通常有一条指令将两个操作数和一个进位相加。如果要实现大整数加法,只需将不带进位的最低整数与带进位的下一个整数相加即可。在无法访问进位标志的 C 或 C++ 中,如何有效地做到这一点?它应该适用于多个编译器和体系结构,因此我不能简单地使用内联汇编等。
您可以使用“钉子”(GMP 中的术语):而不是使用 a 的所有 64 位uint64_t
表示数字时,仅使用其中的 63 个,其中最高位为零。这样您就可以通过简单的位移来检测溢出。您甚至可能想要少于 63。
或者,您可以进行半字算术。如果您可以进行 64 位算术,请将您的数字表示为数组uint32_t
s(或者等效地,将 64 位字拆分为上部和下部 32 位块)。然后,在对这些 32 位整数进行算术运算时,可以先提升到 64 位进行算术运算,然后再转换回来。这可以让你检测进位,如果你没有“multiply hi”指令,它也有利于乘法。
正如另一个答案所示,您可以通过以下方式检测无符号加法中的溢出:
uint64_t sum = a + b;
uint64_t carry = sum < a;
顺便说一句,虽然实际上这也适用于有符号算术,但您有两个问题:
所以你通常最好坚持使用无符号数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)