https://static.assets-stash.eet-china.com/album/old-resources/2009/2/15/f81bb840-226e-4210-b67c-de9a3eb51a35.rar今天调试一个乘法,出了点问题,先看代码示意:
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
}
阅读全文(292) | 回复(4) |反映问题 | 引用通告(0) | 编辑
标签:KEIL C51 乘法
上一篇:在网页中嵌入播放器
下一篇:照片规格
Re:转载:一个关于KEIL C51的乘法运算的问题
访客tXOb61(游客)发表评论于2008-4-1 14:37:00 菜鸟俺遇到心烦的事,请帮忙.
1、事件描述:
BYTE bV1,bV2;
WORD wV;
bV1=2;
bV2=0x17;
wV=(bV1-1)*bV2;
在我的工程里计算结果为1,显然错误了.
2、解决尝试:
将以上表达式,放新建立的KEIL工程中,执行结果却正确了。
3、希望帮我分析分析怎么回事,邮箱地址leidiesheng@21cn.com,非常感谢。
个人主页 | 引用 | 返回 | 删除 | 回复
Re:转载:一个关于KEIL C51的乘法运算的问题
LPC900发表评论于2007-9-10 14:51:00 数字最后面补个大写“L”即可,不需要用“(unsigned long)()”转换这么麻烦。您的程序可以写成:
void test(void)
{
unsigned long mid1,mid2,mid3;
mid1 = 6*10000L; //index1
mid2 = 7*10000L; //index2
mid3 = 8*10000L; //index3
}
用户377235 2015-5-20 21:38
用户1023091 2015-1-6 19:22