简易计算器,运行时在计算结果在70000 到99999之间时结果错误

2019-07-15 23:50发布

本帖最后由 sin88 于 2013-7-4 23:49 编辑

/*
函数名称:

功能:      简易计算器主要程序 放在主函数中
说明:      依据键盘工作函数得出的数据量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;
        }
    }
}
请教各位大侠,问题在哪里?
谢谢

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
悦雨若晴
1楼-- · 2019-07-16 05:39
如果没错的话65536--99999之间应该都是错的,因为long int在这里是有符号32位,有效数据范围-65536--65535超出范围后这个数后就溢出了!
sin88
2楼-- · 2019-07-16 10:23
 精彩回答 2  元偷偷看……
sin88
3楼-- · 2019-07-16 15:10
本帖最后由 sin88 于 2013-7-6 11:03 编辑

补充 乘法运算结果在这个范围时是正确的,出错的只是加法和减法运算,怎么回事?难道是mcu的问题?
另外单独写
long int a,b;
a=70000;
b=1;
a+=b;
结果a是70 001 对的

擦 为什么
sin88
4楼-- · 2019-07-16 20:20
难道太简单了没人回复?
sin88
5楼-- · 2019-07-17 00:21
这个实在找不到问题所在了  跪求高手指点

一周热门 更多>