本算法采用的思想是部分积法,该算法的思想参照《计算机组成原理(Clements)》,该算法只能实现两个无符号数相乘,若要实现有符号数相乘,参考[https://blog.csdn.net/peggy201314/article/details/109638694]
//两个N位的数相乘,其结果最多有2N位,所以乘数和被乘数用unsigned short int,结果用unsigned int;
#include <stdio.h>
//#define _CRT_SECURE_NO_WARNINGS scanf函数被VS认为不安全并报错,如果用VS编译请加上这句话
//读者也可以使用scanf_s();函数,是用该函数就可以不用加上上面这句话
unsigned int mul(unsigned short int a, unsigned short int b) //a是乘数,b是被乘数
{
unsigned int result = 0x00;
int i = 16;
while (i--)
{
if (b & 0x01)
result += (a << 16);
result >>= 1;
b >>= 1;
}
return result;
}
int main(void)
{
int return_value = 0; //这个值接收scanf的返回值
unsigned short int multiplier = 0x00; //乘数
unsigned short int multiplicand = 0x00; //被乘数
printf("Please input multiplier:\n\r");
//scanf的返回值并没有用到,不过在VS软件上运行会警告返回值丢弃,所以就用return_value接收
return_value = scanf("%hd", &multiplier);
printf("Please input multiplicand:\n\r");
return_value = scanf("%hd", &multiplicand);
printf("The result is:%d\n\r", mul(multiplier, multiplicand));
return 0;
}