首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

op_2rr = 2*R[0]*R[0];运算出现意想不到的结果,为什么?解决办法

2013-01-25 
op_2rr 2*R[0]*R[0]运算出现意想不到的结果,为什么?我的程序里面:op_2rr 2*R[0]*R[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},  这种写法也不太好,形参直接传给数组的初始化。最好先定义,后把形参赋值给数组变量吧,局部变量的初始化不是那么好用的。

热点排行