在写代码时突然遇到位数比较大的立即数乘除keil是怎样处理的问题,因为担心会溢出。所以做了如下的测试。
首先发现keil处理立即数运算时是直接就在编译中算出来了。
编译时keil已把结果计算出来了(99*99=9801(10011001001001B))tmp变量高八位100110(0x26)放在地址为0x008内存,低八位1001001(0x49)放在地址为0x009内存中。
如果是更大立即数相乘除但结果宽度不会超过tmp将会怎样,例如:tmp=999*99/99;这时keil编译时是否还可以正确计算出来。测试结果如下图:
从反编译窗口明显看出事出错了。正确的应该是高八位为0x3,第八位应该为0xE7。看来keil在编译时计算立即数时只使用16位来处理,如果中间结果有溢出的最终计算结果就出错。
下面再来测试立即数与变量运算是否也有同样的结果。首先来试下立即数与普通变量运算。
从反汇编窗口看出这时不会直接计算出结果了,计算过程放在了单片机内完成。
以上结果应该都是已经预想得到的。下面测试下tmp=999*99/t; 其实我们可以想到在计算999*99时肯定会溢出但是我们现在把t声明为unsigned long int测试下结果。
结果很明显了。