C长无符号int数操作

nap*_*aza 1 c embedded int unsigned long-integer

我试图在嵌入式C/C++环境中进行一些简单的变量操作.由于某种原因,我一直在得到零.

这是代码

void Heater::setPower( int newpower ) 
{
    printf("1 new power %d\n",newpower);

    if(newpower != power)
        power = newpower;
    else 
        return;

    printf("2 new power %d\n",power);

    // Set Duty
    long unsigned int newduty = 0;

    // Protect from divide by zero
    if(power <= 0)
    {
         printf("2.5 zeroed\n");
         newduty = 0;
         power = 0; 
    }
    else
         newduty = period*(power/100);

    printf("3 setduty %lu period %lu\n", newduty, period);

    setDuty(newduty);
}
Run Code Online (Sandbox Code Playgroud)

这是我收到的输出

1 new power 76
2 new power 76
3 setduty 0 period 10000000
Run Code Online (Sandbox Code Playgroud)

所以我知道收到的号码是76.我知道它已经超过了第一个障碍,第二个障碍.但不知何故,在简单的数学方程式中,它变为零."period"也是一个长的unsigned int,并在类def中声明,但是你可以看到输出是合适的.

为什么这个一直下降到零?缺什么?我是否需要为较大的数字包含一些特殊的东西,或者我不能在长的unsigned int或其他东西上使用简单的运算符*和/?

我正在处理高数字(x <= 10,000,000),因为我正在使用内核级别pwm.

Ben*_*enj 6

你遇到的问题是这power是一个整数,所以当你/100实际上0由于整数除法的规则而得到结果时.这意味着当你乘以它时period,整个结果就是0.

根据您的精度要求,制作power双精度可能就足够了,但要注意(power/100)*period通常会产生一个小数结果,因此也可能需要将结果存储为双精度.

如果你必须坚持使用整数,那么((power*period)/100)这将给你一个相当准确的结果,因为power*period在分裂之前变成一个大数字0.使用整数除法,您放置括号可以是获得a 07600000(在您的情况下)之间的区别.