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

2020-01-17 19:10发布

啥不说,上图

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


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



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
31条回答
schwarz
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。

到这里为止一切都真相大白了。

一周热门 更多>