但是,上述代码,当a等于1000000,b等于5000,运算结果是出乎意外,居然不是500000!出错了。我仔细一分析,又是溢出的问题,因为中间第一步a*b就等于5000000000,超过32位变量类型的范围了,所以出错,正当我纳闷的时候,我就想起了曾经听别人传说过stm32的单片机有一个64位的unsigned long long类型,比u32还大范围的,是64位。于是,更改了试试,结果,奇迹出现了,成功了。我是这样更改的:
u32 a,b,d;
d=((unsigned long long)a*(unsigned long long)b)/10000;//括号的(unsigned long long)表示类型强制转换成64位再计算
复制代码
最后d的结果就是正确的500000.通过这件事,我发现stm32真的比51爽,因为我试了试在C51编辑器上输入unsigned long long变量会出错。就是不知道其它还有哪些单片机能支持64位的变量。这个64位的数据类型在乘除法的运算中真的太重要太实用了,假如所有的单片机都支持这个功能该多好。