使用加法、移位模拟CPU中无符号数乘法
本文最后更新于 166 天前,如有失效请评论区留言。

CPU由控制器和运算器组成,而运算器最核心的是加法器,利用它能够实现减法、乘法、除法等。

下图为王道计组课中知识点,我参考咸鱼老师的流程图,编写了下述程序:以C语言的方式,仅使用加法和移位操作,模拟CPU中无符号数乘法的工作流程。

image-20250628154724333

下为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;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇