有关单片机c的加法为什么会比减法运算速度慢的小疑点
有关单片机c的加法为什么会比减法运算速度慢的小问题、
刚学了个非常简单的操作:AT89C52 的LED灯的闪烁、
然后,我用了这样的一个代码:
#include<reg52.h>
sbit D1=P1^0;
void main()
{
unsigned int i;
while(1)
{
for(i=0;i<50000;i++)
D1=0;
for(i=50000;i>0;i--)
D1=1;
}
}
结果发现灯亮的时间比灭的时间要长、一开始我以为是C中自增自减的实现问题、
于是我把i++和i--换成i=i+1和i=i-1后,结果还是这样。
想不明白,一般机器的运算不是以加法为基础的么,我以为应该是加法比减法速度快才对的、、、纠结中
求高手赐个解答~~~
------解决方案--------------------
你写成
for(i=50000;i>0;i--)
D1=1;
for(i=0;i<50000;i++)
D1=0;
看看谁时间长,谁时间短啊
------解决方案--------------------
是 i--,i>0处理的时间比i++, i<50000需要的时间短。
前者算i = i - 1的时候同时也就判断了原来i和1的关系,也就是现在i和0的关系
后者还要另外算一个i - 50000来判断i和50000的关系
------解决方案--------------------
这样的话,以后是不是对于for之类的循环
如果可能,都是用i--的方式比较好了~~~~
谢谢
------解决方案--------------------
------解决方案--------------------
++版本多一次减法运算,并不是i-1比i-50000快。
for循环一般的确能用i--就用i--。汇编里写循环默认也是用寄存器-1,如果寄存器不等于0继续循环的逻辑。
但是最后还是具体问题具体分析,比如需要严格按顺序访问数组的时候,单弄个变量--就没意义了。
刚学了个非常简单的操作:AT89C52 的LED灯的闪烁、
然后,我用了这样的一个代码:
#include<reg52.h>
sbit D1=P1^0;
void main()
{
unsigned int i;
while(1)
{
for(i=0;i<50000;i++)
D1=0;
for(i=50000;i>0;i--)
D1=1;
}
}
结果发现灯亮的时间比灭的时间要长、一开始我以为是C中自增自减的实现问题、
于是我把i++和i--换成i=i+1和i=i-1后,结果还是这样。
想不明白,一般机器的运算不是以加法为基础的么,我以为应该是加法比减法速度快才对的、、、纠结中
求高手赐个解答~~~
------解决方案--------------------
你写成
for(i=50000;i>0;i--)
D1=1;
for(i=0;i<50000;i++)
D1=0;
看看谁时间长,谁时间短啊
------解决方案--------------------
是 i--,i>0处理的时间比i++, i<50000需要的时间短。
前者算i = i - 1的时候同时也就判断了原来i和1的关系,也就是现在i和0的关系
后者还要另外算一个i - 50000来判断i和50000的关系
------解决方案--------------------
这样的话,以后是不是对于for之类的循环
如果可能,都是用i--的方式比较好了~~~~
谢谢
------解决方案--------------------
------解决方案--------------------
++版本多一次减法运算,并不是i-1比i-50000快。
for循环一般的确能用i--就用i--。汇编里写循环默认也是用寄存器-1,如果寄存器不等于0继续循环的逻辑。
但是最后还是具体问题具体分析,比如需要严格按顺序访问数组的时候,单弄个变量--就没意义了。