找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

STC89C52单片机的除法运算问题

查看数: 3616 | 评论数: 16 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-3-12 15:19

正文摘要:

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

回复

ID:304608 发表于 2021-3-18 11:30
王快活。 发表于 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

你修改代码再试一下, volatile unsigned int temp;  增加一个关键字试试
ID:304608 发表于 2021-3-18 11:28
王快活。 发表于 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/275 ...

我觉得楼上说的对,可能是被优化了
ID:232366 发表于 2021-3-15 21:53
hefq 发表于 2021-3-12 22:07

大佬你的keil配色可以分享一下吗?
ID:550952 发表于 2021-3-15 12:09
感谢各位大佬的耐心解答,我参考了这篇帖子
https://blog.csdn.net/avideointerfaces/article/details/27512485
应该是溢出了
ID:287575 发表于 2021-3-14 23:51
我测试正确的,结果是0x001F
ID:287575 发表于 2021-3-14 23:50
        unsigned int temp;
        temp=100*155/500;

51hei浏览器截图20210314234538.png
ID:487569 发表于 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的值

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:783421 发表于 2021-3-13 14:30
数字有没有溢出?
ID:879348 发表于 2021-3-13 08:18
也可能是temp没有用,被优化了,整个除法没有执行

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:605142 发表于 2021-3-12 22:07
51hei图片20210312220625.png

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:605142 发表于 2021-3-12 22:02
编译器默认是按有符号16位运行,200*255溢出了
a=200u*255/500应该可行

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:213173 发表于 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;

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:451718 发表于 2021-3-12 17:13
确实碰到过这类问题,我的解决方案是:
unsigned int a , temp;
a = 200*255;
temp = a / 500;
这样就不会有错,估计是编译器的问题。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:550952 发表于 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;
}
ID:367369 发表于 2021-3-12 16:55
不应该吧,是不是其他地方把改变值了?
计算的时候应该是有高位寄存器和低位寄存器啊,
像定时器初始化时就写到过(65535 - 1000) /  256

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:390416 发表于 2021-3-12 16:35
这个叫 取模,也就是 除法运算 保留了商 丢弃了余数   ,取余用%

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表