打印
[应用方案]

8位单片机做多位乘除操作

[复制链接]
3224|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elsaflower|  楼主 | 2024-5-28 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今日在8位单片机中做乘除运算,简化代码如下

        unsigned char a = 100;
        unsigned char b = 120;
        unsigned char result = 0;
        result = a*b/120;
        printf("result = %d", result);

以上代码在x86中运行无误,但在8位单片机中:
如果操作数高于8位,或者运算过程中产生了高于8位的数,易产生错误。
例如 100*200 > 256 已经超过8 bit.
所有操作数定义的数据类型,必须足以保存运算过程中产生的最大数值。


使用特权

评论回复
沙发
xiaoyaodz| | 2024-6-4 10:04 | 只看该作者
对于多位乘法,可以使用“长乘法”或“移位和加法”的策略。以16位乘法为例,假设有两个16位的数A和B,可以分别表示为A_high || A_low和B_high || B_low(其中||表示连接操作,即将两个8位数连接成一个16位数)。

初始化结果寄存器为0。
循环处理B的每一位:
如果B的当前位是1,则将A左移相应的位数(对于B的最低位,不移位)并与结果相加。
如果B的当前位是0,则只将A左移相应的位数。
在每次迭代中,B右移一位。
重复步骤2,直到B的所有位都被处理。

使用特权

评论回复
板凳
tifmill| | 2024-6-4 16:20 | 只看该作者
通过重复加法来模拟乘法操作。例如,要计算a乘以b,可以将a加到自己身上b次。这种方法虽然直观,但可能效率不高,特别是当乘数较大时。

使用特权

评论回复
地板
chenjun89| | 2024-6-5 08:10 | 只看该作者
8位机做浮点运算有点吃力的

使用特权

评论回复
5
maqianqu| | 2024-6-5 13:15 | 只看该作者
建立查表法。对于乘法,可以创建一个256×256的乘法表,其中每个元素都预先计算好。这种方法虽然占用较多的内存空间,但是在运行时速度较快。

使用特权

评论回复
6
beacherblack| | 2024-6-5 13:36 | 只看该作者
通过不断地将被除数左移,并与除数比较,如果被除数大于等于除数,则进行一次减法操作,并将商相应位置上的位设置为1。

使用特权

评论回复
7
tabmone| | 2024-6-5 16:33 | 只看该作者
实现多位乘除操作的代码可能会相对较大,这可能会占用宝贵的程序存储空间。

使用特权

评论回复
8
hudi008| | 2024-6-7 21:26 | 只看该作者
在资源有限的单片机上,可能需要在速度和精度之间做出权衡。

使用特权

评论回复
9
gygp| | 2024-6-8 09:14 | 只看该作者
如果8位单片机的硬件支持,还可以使用软件来模拟更高位数的乘法和除法操作。这种方法虽然比直接在硬件上执行慢很多,但是对于一些特殊的应用场景可能是一个可行的解决方案。

使用特权

评论回复
10
phoenixwhite| | 2024-6-8 18:15 | 只看该作者
可能需要考虑更多的细节,如溢出处理、程序的优化等。

使用特权

评论回复
11
bartonalfred| | 2024-6-9 11:38 | 只看该作者
由于单片机的资源有限,进行多位数的乘除运算可能会消耗较多的时间和资源,因此在设计程序时,应该尽量优化算法,减少不必要的循环和计算。

使用特权

评论回复
12
sesefadou| | 2024-6-9 14:10 | 只看该作者
对于更复杂的运算,可能需要使用数学库函数或者自己编写更高级的算法来处理。

使用特权

评论回复
13
wengh2016| | 2024-6-9 17:50 | 只看该作者
对于除法操作,一种常见的方式是使用模运算和整数除法。如果除数和被除数都是16位的,可以先用16位数除以最不重要的8位(即从右边数起),然后用商乘以除数,再从被除数中减去该结果,将差作为新的被除数,重复该过程直到除数完全除尽。

使用特权

评论回复
14
lzmm| | 2024-6-10 19:31 | 只看该作者
对于乘法操作,一种常见的方法是使用移位和加法来实现多字节乘法。例如,如果要计算两个16位数(例如a和b)的乘积,可以先将其中一个数(比如a)拆分为高8位和低8位,然后分别与另一个数(b)相乘,最后将结果相加。

使用特权

评论回复
15
nomomy| | 2024-6-10 20:18 | 只看该作者
可以使用基于移位和累加的乘法算法,这种方法适合在微控制器上实现,因为它不需要大量的硬件资源。

使用特权

评论回复
16
uytyu| | 2024-6-11 22:52 | 只看该作者
对于除法操作,情况更为复杂,因为除法不像乘法那样可以通过简单的移位和加法来分解。在8位单片机上实现多字节除法通常需要使用长除法算法,这是一种迭代算法,逐步减少被除数,直到它可以被除数整除为止。这个过程涉及到多次比较、减法和移位操作。

使用特权

评论回复
17
daichaodai| | 2024-6-12 08:06 | 只看该作者
8位机做乘除运算有点吃力

使用特权

评论回复
18
sdlls| | 2024-6-12 09:21 | 只看该作者
dividend_high = dividend >> 8; // 被除数的高8位
dividend_low = dividend & 0xFF; // 被除数的低8位

remainder = 0; // 初始化余数为0
quotient = 0; // 初始化商为0

// 处理被除数的高8位
for i = 0 to 7 do
    if (remainder > divisor) or (remainder = divisor and dividend_low >= divisor) then
        remainder = remainder - divisor;
        quotient = quotient | (1 << i);
    endif
    if i < 7 then
        remainder = (remainder << 1) | (dividend_low >> (7 - i));
    endif
endfor

// 处理被除数的低8位
for i = 0 to 7 do
    if remainder >= divisor then
        remainder = remainder - divisor;
        quotient = (quotient << 1) | 1;
    else
        quotient = quotient << 1;
    endif
    remainder = remainder << 1;
    if i < 7 then
        remainder = remainder | (dividend_low >> (6 - i));
    endif
endfor

// 最终的商就是quotient,余数是remainder

使用特权

评论回复
19
mattlincoln| | 2024-6-13 21:59 | 只看该作者
在执行多位运算时,需要特别注意溢出问题。如果结果超出了单片机的寄存器或数据类型的范围,可能会导致错误的结果或程序崩溃。

使用特权

评论回复
20
cashrwood| | 2024-6-14 11:04 | 只看该作者
对于某些特定的乘法或除法操作,可以预先计算好结果并存储在表中,通过查表来加快运算速度。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

1258

帖子

0

粉丝