矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3533|回复: 18

请教大家,C51两个数运算的问题

[复制链接]
     
发表于 2019-8-11 21:30:30 | 显示全部楼层 |阅读模式
signed int angle=0;
unsigned long beats=0;

void main()
{

        angle=10*360;
        beats =(angle*4096)/360;


  问题出现了,这两个式子这里,死活过不去。把angle的int型改为long型,就可以了,这是为什么呢?
     
发表于 2019-8-11 21:42:56 | 显示全部楼层
#define int_MAX 32767
回复 支持 反对

使用道具 举报

     
发表于 2019-8-11 23:15:25 | 显示全部楼层
你写出的语句没问题,可能是其他代码影响导致编译通不过了。
回复 支持 反对

使用道具 举报

     
发表于 2019-8-11 23:28:06 | 显示全部楼层
ntwhq 发表于 2019-8-11 23:15
你写出的语句没问题,可能是其他代码影响导致编译通不过了。

3600*4096是多少啊???

怎么可能没问题,问题太大了。
回复 支持 反对

使用道具 举报

     
发表于 2019-8-12 00:19:01 | 显示全部楼层
本帖最后由 壹法拉 于 2019-8-12 00:30 编辑

哼哼!这是典型的单片机出现的溢出BUG;
更常见的是 char (8位)类型的出现这类溢出的问题,这个类型的最大值是255;

int(16位) 类型是最大值是255X255; 你看看你那个,是4096* angle(最大时 4096X3600); 两数的数据类型不一致; 编译时要位数对齐;当然必须改为 long(32位)了!

要注意的是: c 语言的数据类型,在单片机编程与pc机编程时的位数不完全一致;

回复 支持 反对

使用道具 举报

     
发表于 2019-8-12 07:21:29 | 显示全部楼层
强制类型呀,整数式子前加一个长整型符。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-12 09:28:20 | 显示全部楼层
  谢谢各位回复,涨见识了。
  运算时,数据类型要一致。
  我本来以为,会强制成long型呢
回复 支持 反对

使用道具 举报

     
发表于 2019-8-12 10:10:06 | 显示全部楼层
bis 发表于 2019-8-11 23:28
3600*4096是多少啊???

怎么可能没问题,问题太大了。

我在KEIL 5中beats =(angle*4096)/360编译能通过。
回复 支持 反对

使用道具 举报

     
发表于 2019-8-12 11:47:55 | 显示全部楼层
8bit系统中int占2字节,即最大32768,32bit系统中int占4字节,即最大2147483648‬ ,8bit系统中lang占4字节,即最大2147483648‬。
回复 支持 反对

使用道具 举报

     
发表于 2019-8-12 11:58:47 | 显示全部楼层
ntwhq 发表于 2019-8-12 10:10
我在KEIL 5中beats =(angle*4096)/360编译能通过。

你说的Keil 5是个什么东西?如果是C51,能编译通过但是绝对不可能按照你预想的运行。如果是RVMDK,那才会正常运行。
回复 支持 反对

使用道具 举报

     
发表于 2019-8-12 13:00:44 | 显示全部楼层
按倪angle的赋值(angle*4096)已经溢出了
回复 支持 反对

使用道具 举报

     
发表于 2019-8-16 07:50:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-16 19:58:48 | 显示全部楼层
(angle*4096)请教大家,运算的结果,怎么会影响angle呢?
回复 支持 反对

使用道具 举报

     
发表于 2019-8-16 20:12:40 | 显示全部楼层
bios 发表于 2019-8-16 19:58
(angle*4096)请教大家,运算的结果,怎么会影响angle呢?

乘积太大了,装不下了,系统会丢掉装不下的部分---出错了。
回复 支持 反对

使用道具 举报

     
发表于 2019-8-17 16:36:32 | 显示全部楼层
bios 发表于 2019-8-16 19:58
(angle*4096)请教大家,运算的结果,怎么会影响angle呢?

在吃不准的情况下,单步运行程序,观察(Watch)变量值的变化,从而判断是否溢出。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-26 17:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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