为什么使用stc12c5a60s2 乘除法运算出现大误差?
本帖最后由 xiaoaf 于 2014-4-1 14:45 编辑情况是这样的, 手头有个3字节的 整数
字节高位rtemp0=0x50;
字节中rtemp1=0xc2;
字节地位rtemp2=0x72;
temp=(rtemp0<<8)+rtemp1;
temp=(temp<<8)+rtemp2;
也就是说理论上temp=5292658;
再拿出一个整形数 unsigned int num;
经过运算num=temp/10000=5292658/10000=522;实际应该是等于529这样才对吧!
为什么会偏差那么大 求解! 有完整的程序么 本帖最后由 xiaoaf 于 2014-4-1 16:19 编辑
lcw_swust 发表于 2014-4-1 14:51
有完整的程序么
程序如下
char rtemp0=0,rtemp1=0,rtemp2=0;
unsigned long Irms=0;
cs5460_wbyte(0X16);//读电流值
rtemp0=cs5460_rbyte();//读出所测数据
rtemp1=cs5460_rbyte();//读出所测数据
rtemp2=cs5460_rbyte();//读出所测数据
USART_TX(0xff);
USART_TX(rtemp0);//这一段是用来把读到的数据送到串口传给上位机看的,
USART_TX(rtemp1);
USART_TX(rtemp2);
USART_TX(0xfe);
{Irms=(rtemp0<<8)+rtemp1; //参与运算的就这三条语句
Irms=(Irms<<8);
int_ascii(((uint)Irms/10000));}// 问题就出在这里 我只要取出高3位 我通过上位机读出来 3个字节的值 0x50c272 =5292658
但是显示出来的却是 522 应该是529 才对
{Irms=(rtemp0<<8)+rtemp1;
int_ascii(((uint)Irms*0.0256));} //因为只要取高3位 我用这个方法计算也是一样的问题
void int_ascii(int int_num)//将要显示的数转换后显示出来
{
int mid_mun;
mid_mun=int_num;
if(mid_mun<0)
{
mid_mun=0-mid_mun;
}
if(int_num<=-100)
{
ASCII_num=10;
mid_mun=mid_mun%1000;
ASCII_num=(unsigned char)(mid_mun/100);
mid_mun=mid_mun%100;
ASCII_num=(unsigned char)(mid_mun/10);
}
else if(int_num<=-10)
{
ASCII_num=15;
mid_mun=mid_mun%1000;
ASCII_num=10;
mid_mun=mid_mun%100;
ASCII_num=(unsigned char)(mid_mun/10);
}
else if(int_num<0)
{
ASCII_num=15;
mid_mun=mid_mun%1000;
ASCII_num=15;
mid_mun=mid_mun%100;
ASCII_num=10;
}
else if(int_num>=1000)
{
ASCII_num=(unsigned char)(mid_mun/1000);
mid_mun=mid_mun%1000;
ASCII_num=(unsigned char)(mid_mun/100);
mid_mun=mid_mun%100;
ASCII_num=(unsigned char)(mid_mun/10);
}
else if(int_num>=100)
{
ASCII_num=15;
mid_mun=mid_mun%1000;
ASCII_num=(unsigned char)(mid_mun/100);
mid_mun=mid_mun%100;
ASCII_num=(unsigned char)(mid_mun/10);
}
else if(int_num>=10)
{
ASCII_num=15;
mid_mun=mid_mun%1000;
ASCII_num=15;
mid_mun=mid_mun%100;
ASCII_num=(unsigned char)(mid_mun/10);
}
else if(int_num>=0)
{
ASCII_num=15;
mid_mun=mid_mun%1000;
ASCII_num=15;
mid_mun=mid_mun%100;
ASCII_num=15;
}
ASCII_num=(unsigned char)(mid_mun%10);
for(mid_mun=0;mid_mun<4;mid_mun++)
display(mid_mun,ASCII_num);//i位选 num 内容 0-9 - E H L P
} (rtemp0<<8) 注意类型转换,char型右移8位变啥了啊。 fzkqi 发表于 2014-4-1 16:18
(rtemp0
哇 大神一语道破天机 果然是这里出问题了,改成 unsinged char就解决了 十分感谢!!!!! xiaoaf 发表于 2014-4-1 16:12
程序如下
char rtemp0=0,rtemp1=0,rtemp2=0;
看来楼主对数据类型不够了解呀.
建议做以下改动:
char rtemp0...... 改为 unsigned char rtemp0......
Irms=(rtemp0<<8)+rtemp1; 改为 Irms=((unsigned int)rtemp0<<8)+rtemp1;
nt_ascii(((uint)Irms/10000)); 改为 nt_ascii((uint)(Irms/10000)); 或者 nt_ascii(Irms/10000);
lcw_swust 发表于 2014-4-1 14:51
有完整的程序么
问题已解决 ,就是 rtemp 这 个类型吧char 改 uchar 就好了 谢谢! lcw_swust 发表于 2014-4-1 16:23
看来楼主对数据类型不够了解呀.
建议做以下改动:
char rtemp0...... 改为 unsigned char rtemp0......
嗯嗯,解决了,一时没注意到这个问题唉唉,就说怎么会差那么多, xiaoaf 发表于 2014-4-1 16:23
问题已解决 ,就是 rtemp 这 个类型吧char 改 uchar 就好了 谢谢!
呵呵,楼主不妨多试几组数据 lcw_swust 发表于 2014-4-1 16:26
呵呵,楼主不妨多试几组数据
试了,已经是没有问题了, 看来以后这个类型确实要 看清楚了, 搞了我一个下午了呵呵 看来我自己平时也得多注意些这些具体的细节
页:
[1]