Keil C51 运算 *10000,数据老溢出,什么问题?

2020-01-17 19:10发布

啥不说,上图

QQ截图20131025224129.jpg (95.85 KB, 下载次数: 0) 下载附件 2013-10-25 22:41 上传


程序调了一个多小时才发现这问题,,,仿真一下,吓了身汗,不知道我做出去的产品有没有用到这种 *10000 



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
30条回答
erpao
1楼-- · 2020-01-18 13:49
本帖最后由 erpao 于 2013-10-26 00:03 编辑

位运算?
schwarz
2楼-- · 2020-01-18 14:01
这个Bug都是你自己的C语言水平不够造成的,原因其实很简单,就以第一个错误为例,在C语言里面常数不加l、f限定的话一律按照int类型处理(8位单片机int一般是16位宽,32位机是32位宽),而且常数的运算在编译阶段已经被优化了。
a4=4*10000与a4=40000完全等效,40000的16进制是0x9c40,
也就是a4=0x9c40,注意0x9c40这个16位宽的int型常量最高位是1,也就是负数,而a4是32位宽的long类型,根据符号位扩展,a4被赋予的值是0xffff9c40,也就是你看到的4294941760。

到这里为止一切都真相大白了。
zuu0
3楼-- · 2020-01-18 18:30
 精彩回答 2  元偷偷看……
wxty
4楼-- · 2020-01-18 23:35
不过单片机一般都使用unsigned 类型吧?
richards
5楼-- · 2020-01-19 00:40
真相大白,c语言任重道远
LearningASM
6楼-- · 2020-01-19 01:34
我只使用unsigned型 ,自己判断有没有溢出。

一周热门 更多>