本文最后更新于 166 天前,如有失效请评论区留言。
CPU由控制器和运算器组成,而运算器最核心的是加法器,利用它能够实现减法、乘法、除法等。
下图为王道计组课中知识点,我参考咸鱼老师的流程图,编写了下述程序:以C语言的方式,仅使用加法和移位操作,模拟CPU中无符号数乘法的工作流程。

下为C代码:
/*****************************************
* 此程序模拟实现CPU中的无符号数的乘法运算。
* 数据类型:无符号数
* 数据大小:N bit
* 实现工具:加法器、逻辑移位
*****************************************/
#include <stdio.h>
#include <stdbool.h>
const int N = 15; // 设置字长为N位,最大为15位!
void print_binary(unsigned int num) {
for (int i = sizeof(num) * 8 - 1; i >= 0; i--) {
putchar((num & (1u << i)) ? '1' : '0');
}
}
unsigned int getResult(unsigned int PY)
{
int res = 0;
for (int i = N; i > 0; i--)
{
res += (PY % 2) * (1 << (N - i));
PY >>= 1;
}
if (PY != 0)
printf("发生溢出!\n");
return res;
}
int main()
{
short Cn = N; // 计数器为N
unsigned int PY = 0; // 第一位为进位,中间四位为乘积寄存器,最后四位为乘数寄存器
unsigned int X = 0; // 被乘数
unsigned int Y = 0; // 乘数
bool is_add = 0; // 保存乘数寄存器的最后一位,判断下一步是否执行加法
while (1)
{
PY = 0, Cn = N;
printf("本乘法计算器允许的最大值为%d,请输入被乘数和乘数:\n", (1 << (N)) - 1);
scanf("%d %d", &X, &Y);
if (X > (1 << (N)) - 1 || Y > (1 << (N)) - 1)
{
printf("你输入的数字太大了!\n");
continue;
}
//printf("X为:");
//print_binary(X);
//printf("\nY为:");
//print_binary(Y);
//printf("\n");
if (X == 0 || Y == 0)
{
printf("result = 0\n");
continue;
}
// x=3 0011,y=5 0101
PY += Y;
while (Cn--)
{
is_add = PY % 2;
//printf("当前Cn=%d, is_add=%d, \n当前PY=", Cn+1, is_add);
//print_binary(PY);
//printf("\n");
if (is_add == 1)
{
PY += (X << N);
//printf("加后PY=");
//print_binary(PY);
//printf("\n");
}
PY = PY >> 1;
//printf("移后PY=");
//print_binary(PY);
//printf("\n");
}
printf("result = %d\n\n", getResult(PY));
}
return 0;
}