简易计算器,运行时在计算结果在70000 到99999之间时结果错误
时间:10-02
整理:3721RD
点击:
/*
函数名称:
功能: 简易计算器主要程序 放在主函数中
说明: 依据键盘工作函数得出的数据量cc进行数据、状态量输入记录及相应计算
备注: 本函数在计算结果在70 000 到99 999之间时 结果错误(一定),结果为其他时正确(仅几个关键点测试过)
*/
bit key_work_loak;
unsigned char cc,in_sec,key_in_shu[6],zt_sec;
long int in_a,in_b;
void calc_work(void){
if(key_work_loak==1){
key_work_loak=0;
if(cc<11&& in_sec<6&& display_loak==0){
key_in_shu[0]=key_in_shu[1];
key_in_shu[1]=key_in_shu[2];
key_in_shu[2]=key_in_shu[3];
key_in_shu[3]=key_in_shu[4];
key_in_shu[4]=key_in_shu[5];
key_in_shu[5]=cc;
in_sec++; //记录输入次数
//if(in_sec>5)in_sec=0;
}
else if(cc==111&&display_loak==0){
zt_sec=1; //除法状态记忆
in_a=(long int)(key_in_shu[0]*100000)
+(long int)(key_in_shu[1]*10000)
+(long int)(key_in_shu[2]*1000)
+(long int)(key_in_shu[3]*100)
+(key_in_shu[4]*10)
+key_in_shu[5];
key_in_shu[0]=0;
key_in_shu[1]=0;
key_in_shu[2]=0;
key_in_shu[3]=0;
key_in_shu[4]=0;
key_in_shu[5]=0;
//in_a=0;
in_sec=0;
}
else if(cc==112&&display_loak==0){
zt_sec=2; //乘法状态记忆
in_a=(long int)(key_in_shu[0]*100000)
+(long int)(key_in_shu[1]*10000)
+(long int)(key_in_shu[2]*1000)
+(long int)(key_in_shu[3]*100)
+(key_in_shu[4]*10)
+key_in_shu[5];
key_in_shu[0]=0;
key_in_shu[1]=0;
key_in_shu[2]=0;
key_in_shu[3]=0;
key_in_shu[4]=0;
key_in_shu[5]=0;
in_sec=0;
}
else if(cc==113&&display_loak==0){
zt_sec=3; //减法状态记忆
in_a=(long int)(key_in_shu[0]*100000)
+(long int)(key_in_shu[1]*10000)
+(long int)(key_in_shu[2]*1000)
+(long int)(key_in_shu[3]*100)
+(key_in_shu[4]*10)
+key_in_shu[5];
key_in_shu[0]=0;
key_in_shu[1]=0;
key_in_shu[2]=0;
key_in_shu[3]=0;
key_in_shu[4]=0;
key_in_shu[5]=0;
in_sec=0;
}
else if(cc==114&&display_loak==0){
zt_sec=4; //加法状态记忆
in_a=(long int)(key_in_shu[0]*100000)
+(long int)(key_in_shu[1]*10000)
+(long int)(key_in_shu[2]*1000)
+(long int)(key_in_shu[3]*100)
+(key_in_shu[4]*10)
+key_in_shu[5];
key_in_shu[0]=0;
key_in_shu[1]=0;
key_in_shu[2]=0;
key_in_shu[3]=0;
key_in_shu[4]=0;
key_in_shu[5]=0;
in_sec=0;
}
else if(cc==110&&display_loak==0){ //等于计算
in_b=(long int)(key_in_shu[0]*100000)
+(long int)(key_in_shu[1]*10000)
+(long int)(key_in_shu[2]*1000)
+(long int)(key_in_shu[3]*100)
+(key_in_shu[4]*10)
+key_in_shu[5];
switch (zt_sec){
case 1:
zt_sec=0;
in_a=in_a/in_b;
break;
case 2:
zt_sec=0;
in_a=in_a*in_b;
break;
case 3:
zt_sec=0;
in_a=in_a-in_b;
break;
case 4:
zt_sec=0;
in_a=in_a+in_b;
break;
}
key_in_shu[0]=in_a%1000000/100000;
key_in_shu[1]=in_a%100000/10000;
key_in_shu[2]=in_a%10000/1000;
key_in_shu[3]=in_a%1000/100;
key_in_shu[4]=in_a%100/10;
key_in_shu[5]=in_a%10;
display_loak=1;
//inok_loak=1
}
else if(cc==0xff){ //清零
in_a=0;
in_b=0;
in_sec=0;
key_in_shu[0]=0;
key_in_shu[1]=0;
key_in_shu[2]=0;
key_in_shu[3]=0;
key_in_shu[4]=0;
key_in_shu[5]=0;
display_loak=0;
//cc=0;
}
}
}
请教各位大侠,问题在哪里?
谢谢
如果没错的话65536--99999之间应该都是错的,因为long int在这里是有符号32位,有效数据范围-65536--65535超出范围后这个数后就溢出了!
不对啊,100000~700000间是对的,出错的只有70000~99999和700000~999 999这个范围
long int 是32位的吧 数据范围是-2^31 ~2^31-1
比如 555 555+1 结果是555 556 对的
888 888+1 结果是823 353 错的
88 888+1结果是23 353 错的
69 999+1结果是70 000 对的
70 000+1结果是4465 错的
65 535+1结果是65 536对的
补充 乘法运算结果在这个范围时是正确的,出错的只是加法和减法运算,怎么回事?难道是mcu的问题?
另外单独写
long int a,b;
a=70000;
b=1;
a+=b;
结果a是70 001 对的
擦 为什么
难道太简单了没人回复?
这个实在找不到问题所在了 跪求高手指点