正确的是
IAR默认常数是int型,程序中a为无符号,200有符号,两个有符号数相乘得到是有符号数,再把这个值付给无符号a,于是得到4294941760这个不是乱码是溢出了,一看这种大端数你应该有所注意。
可以这样改
#include
unsigned long a;
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
a=200u*200u;
}
就行了,我运行过,这样随便你怎么运行都不会错,编译器可以设置变量定义你自己多看看,还有你这种编程时不可靠的,在IAR中无使用变量编译器会自动跳过,结尾也应该加while(1)
正确如下
#include
unsigned long a;
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
a=200u*200u;
a= a;
while(1);
}
还有问题到我空间留言吧 http://hi.baidu.com/irobot2010/
我仿真了一下,若是 a=200*200;确实有警告,但是改成a=400000*200时就报错
这个情况我也遇见过,还记得微机原理中学过的乘法指令吧,当两个高位数相乘时需要进行数据位扩充,把低位和高位分开放,你可以先把200赋给a,即a=200;a*=200;这样应该就不会出错,这时200占据a的低位,再与200相乘结果比较大的数放在a的高位!这个问题应该是一个很普遍的问题,单片机,dsp这些mcu中应该都会遇到!
200*200貌似还不是long吧
unsigned int 0--65535
unsigned iong 0--4294967295