原创 一个关于KEILC的乘法运算的问题。。

2007-3-19 23:17 3827 12 13 分类: MCU/ 嵌入式

今天调试一个乘法,出了点问题,先看代码示意:


void test(void)


{


       unsigned long mid1,mid2,mid3;


       mid1=6*10000;//index1


       mid2=7*10000;//index2


        mid="8"*10000;//index3


}


咋一看,这段代码似乎是对的,其实不然,如果跟踪调试一下代码就会发现:


mid1=0xea60=60000;


mid2=0x1170=4464;


mid3=0x3880=14464;


mid1是正确的,mid2和mid3是错误的!


产生错误的原因是:


编译器在编译的时候把6*10000、7*10000以及8*10000计算得来的结果存在了一个unsigned int类型的变量当中,unsigned int类型变量的最大值是0xffff,即65536,因此在 index2与index3行中发生了数据溢出,导致计算错误!


解决方法:


void test(void)


{


       unsigned long mid1,mid2,mid3;


       mid1=6*(unsigned long)10000;//index1


       mid2=7*(unsigned long)10000;//index2


        mid="8"*(unsigned long)10000;//index3


}


请注意,以下代码是错误的!至于错误原因,大家自己分析吧。


void test(void)


{


       unsigned long mid1,mid2,mid3;


       mid1=(unsigned long)(6*10000);//index1


       mid2=(unsigned long)(7*10000);//index2


        mid=(unsigned long)(8*10000);//index3


}


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1405232 2009-3-18 11:48

溢出的原因是LZ说的 解决的方案 感觉还是还原比较好
相关推荐阅读
用户1434095 2014-07-08 09:09
21QA百度关键词搜索排名跃居第一了~
有图有真相,感谢大家的支持~ ...
用户1434095 2010-10-16 18:37
LPC23XX之I2C使用总结
LPC23XX之I2C使用总结--- 原野之狼写于2010年重阳节之时 近来由于项目需要,玩了玩LPC23XX系列的I2C,这么一个小小的东西费了我一周的时间,实在是令人崩溃!首先要指出的是,原厂的L...
用户1434095 2009-12-08 01:21
十亿个掌声响起来
闲来无事,翻出硬盘整理资料,发现了收藏已久但一直没仔细看的邓丽君的演唱会《十亿个掌声》。邓丽君小姐英年早逝,但是却留下了这么经典的作品,她无愧为超级巨星,甜美的嗓音和完美的演唱技巧,带领人们走进真、善...
用户1434095 2009-03-12 19:31
漂泊四海 闯荡江湖
好久好久没有这么惬意了,住在十六层,明媚的阳光从窗户照进来,喝着茶,听着音乐。印象中,也就数高三那年的日子最开心了,完全放开了,考试啥的都统统见鬼去,要么跟一批死党们成天在教室门外狂侃海侃,要么是跟乐...
用户1434095 2008-10-28 22:10
PCI转并口 SJF 配置全过程
PCI转并口 SJF 配置全过程http://blog.chinaunix.net/u2/70540/showart_722069.html pci转并口卡+wiggler调试ARM的一点经验http...
用户1434095 2008-09-17 09:38
AVR单片机外部RAM访问
AVR单片机外部RAM访问<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />作者:原野...
EE直播间
更多
我要评论
1
12
关闭 站长推荐上一条 /3 下一条