我有64位数字(63位+符号位),表示为2的补码数,存储在两个无符号32位整数中。
struct Long
{
uint32 high;
uint32 low;
}
如何实现乘法算法,仅使用32位数,并检查结果是否适合63位,我想返回一个错误代码,如果结果不适合则表示溢出。
答案 0 :(得分:5)
一般来说你需要2 * n位来存储两个n位数的乘积(最大结果是(2 ^ n)^ 2 = 2 ^(2 * n)),所以我最好的想法是将数字分开分成四个16位部分,将它们逐个相乘并将它们相加。总共16次乘法,但错误检查很简单。
答案 1 :(得分:1)
查看GNU MP library中的'longlong.h'头文件。我相信这个标题的一个版本也在GNU C源代码中。宏: smul_ppmm 是根据无符号双字产品定义的: umul_ppmm 。这为您提供32x32 => 64位乘法,您可以使用它来实现64x64 => 128位乘法。