标题: STC89C52单片机的除法运算问题 [打印本页]

作者: 王快活。    时间: 2021-3-12 15:19
标题: STC89C52单片机的除法运算问题
想请教各位大佬关于STC89C52除法的问题。
大概就是发现程序在没有准确算出这个式子的结果,调试出来的结果也很奇怪。
个人猜测是和STC89C52只有8位有关,但是由于自己单片机原理方面不太懂,所以想请教一下大家。

2.png (3.19 KB, 下载次数: 62)

调试结果

调试结果

1.png (4.31 KB, 下载次数: 70)

算式

算式

作者: 人人学会单片机    时间: 2021-3-12 16:35
这个叫 取模,也就是 除法运算 保留了商 丢弃了余数   ,取余用%
作者: game灬boy    时间: 2021-3-12 16:55
不应该吧,是不是其他地方把改变值了?
计算的时候应该是有高位寄存器和低位寄存器啊,
像定时器初始化时就写到过(65535 - 1000) /  256
作者: 王快活。    时间: 2021-3-12 17:03
game灬boy 发表于 2021-3-12 16:55
不应该吧,是不是其他地方把改变值了?
计算的时候应该是有高位寄存器和低位寄存器啊,
像定时器初始化时 ...

这是我特意新建的一个工程,整个代码就下面几句
#include <reg52.h>
void main(void)
{
        unsigned int temp;
       
        temp = 200*255/500;
}
作者: robinsonlin    时间: 2021-3-12 17:13
确实碰到过这类问题,我的解决方案是:
unsigned int a , temp;
a = 200*255;
temp = a / 500;
这样就不会有错,估计是编译器的问题。
作者: wulin    时间: 2021-3-12 21:41
本帖最后由 wulin 于 2021-3-12 21:48 编辑

强制转换数据类型,200和255默认为unsigned char型,500默认为unsigned int型。类型统一就不会错了。
tepm=(unsigned int)(200*255)/500;也可以分两步计算也不会错。
tepm=200*255;
tepm=tepm/500;

作者: hefq    时间: 2021-3-12 22:02
编译器默认是按有符号16位运行,200*255溢出了
a=200u*255/500应该可行
作者: hefq    时间: 2021-3-12 22:07



作者: wufa1986    时间: 2021-3-13 08:18
也可能是temp没有用,被优化了,整个除法没有执行
作者: 绕指的柔    时间: 2021-3-13 14:30
数字有没有溢出?
作者: ZXWPL    时间: 2021-3-14 17:47
void main(void) {         unsigned int temp,a;                  temp = 200*255/500;a=temp; }.试试这个,然后你再看运算结果。我怀疑你并没有执行运算,你定义temp的时候没有赋初值,Value=0XFFE可能是temp运算之前的随机值,按我给出的例子,当你指针指到a=temp;的时候再看temp的值
作者: zhangxiaozi    时间: 2021-3-14 23:50
        unsigned int temp;
        temp=100*155/500;

51hei浏览器截图20210314234538.png (4.27 KB, 下载次数: 58)

51hei浏览器截图20210314234538.png

作者: zhangxiaozi    时间: 2021-3-14 23:51
我测试正确的,结果是0x001F
作者: 王快活。    时间: 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/27512485
应该是溢出了
作者: SHANWAZI    时间: 2021-3-15 21:53
hefq 发表于 2021-3-12 22:07

大佬你的keil配色可以分享一下吗?
作者: profile5    时间: 2021-3-18 11:28
王快活。 发表于 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

我觉得楼上说的对,可能是被优化了
作者: profile5    时间: 2021-3-18 11:30
王快活。 发表于 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

你修改代码再试一下, volatile unsigned int temp;  增加一个关键字试试




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1