为什么把常数换成了a,周期就翻了四倍呀

问题遇到的现象和发生背景
void T0_Init()
{
    TMOD=0x01;
    TH0=(65536-50/1.09)/256;      
    TL0=(65536-50/1.09);
    TR0=1;    //启动定时器0
    ET0=1;    //打开中断
}

void T0_Int()interrupt 1     //1是定时器0的序号
{
    static int cnt,scanf_cnt1;           //staic 可使cnt scanf_cnt都作为一个全局变量可以保存它被修改以后的值
    char a;        
    a=45;
    scanf_cnt1=(10*a+500)/70;
    TH0=(65536-50/1.09)/256;    //定时50    us     11/1.09~10    TH0=(65536-10/1.09)/256;
    TL0=(65536-50/1.09);

    cnt++;
    if(cnt>270)           //270次大约达到20ms
        cnt=0;
    if(cnt<scanf_cnt1) //通过改变scanf_cnt的值来改变占空比,高电平的时间
        led1=1;
    else 
        led1=0;
}

只有这里有a;第一次我是写scanf_cnt=(1045+500)/70;
测出来的周期是20ms
后来我想让scanf_cnt变成可控的,就写成scanf_cnt1=(10
a+500)/70;
但是测出来的周期是80ms,我弄不明白

这因为编译器在编译阶段直接计算出常量表达式(10*45+500)/70的结果。如果你写成(10*a+500)/70,这不是常量表达式,编译器需要生成代码计算一次乘法,一次加法和一次除法才能得到结果,所以时间周期就长了。