当前位置: 代码迷 >> 单片机 >> op_2rr = 二*R[0]*R[0];运算出现意想不到的结果,为什么
  详细解决方案

op_2rr = 二*R[0]*R[0];运算出现意想不到的结果,为什么

热度:30   发布时间:2016-04-28 15:48:36.0
op_2rr = 2*R[0]*R[0];运算出现意想不到的结果,为什么?
我的程序里面:
op_2rr = 2*R[0]*R[0]; 出现了错误的结果。



#define uint32 unsigned long int
#define uint16 unsigned int
#define uint8 unsigned char


void draw_Pieslice(uint16 x, uint16 y, uint16 R_out, uint16 R_in,uint32 stangle, uint32 endangle, uint8 color)

……
uint8 R[2]={R_out,R_in},Lx1[2]={0},Ly1[2]={0},Lx2[2]={0},Ly2[2]={0};

for ( i = 0; i < 2; i++)
{
op_2rr = 2*R[0]*R[0];

……
}
}
调用:

draw_Pieslice(300, 300,200, 50,30, 80,0xFC);



本来R[0]=200;
这样的话 op_2rr = 2*R[0]*R[0];应该等于:80000 可是出来的结果却是:14464

我去掉2倍:cccc=R[i]*R[i]; 应该是:40000 结果却是:-25536


我换成这个:
ddd1=R[i];
ddd2=ddd1*ddd1;

i=0时:ddd2=4000 结果正确。


变量类型长度是够的 为什么会出现这种错误呢?有谁能告诉我

------解决方案--------------------
80000 - 65536 = 14464
40000 + 25536 = 65536


------解决方案--------------------
op_2rr = 2 * (uint32)R[0] * (uint32)R[0]; 

要不这样试试?
------解决方案--------------------
uint8 R[2]={R_out,R_in}, 这种写法也不太好,形参直接传给数组的初始化。最好先定义,后把形参赋值给数组变量吧,局部变量的初始化不是那么好用的。