【问题标题】:C long unsigned int number manipulationC long unsigned int 数字操作
【发布时间】:2012-10-10 22:24:24
【问题描述】:

我正在尝试在嵌入式 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);
}

这是我收到的输出

1 new power 76
2 new power 76
3 setduty 0 period 10000000

所以我知道收到的号码是 76。我知道它通过了第一个障碍和第二个障碍。但不知何故,在简单的数学方程中,它变成了零。 “句点”也是一个 long unsigned int 并且在类 def 中声明,但您可以看到输出是合适的。

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

我正在处理大量数字 (x

【问题讨论】:

    标签: c embedded int long-integer unsigned


    【解决方案1】:

    您遇到的问题是power 是一个整数,所以当您/100 时,由于integer division 的规则,您实际上最终会得到0 的结果。这意味着当你将它乘以period 时,整个结果就是0

    根据您的精度要求,将 power 设为双精度可能就足够了,但请注意,(power/100)*period 通常会产生小数结果,因此可能还需要将结果存储在双精度中。

    如果您必须坚持使用整数,只需执行((power*period)/100) 这将为您提供相当准确的结果,因为power*period 在除法将任何内容变为0 之前已成为一个大数。使用整数除法,括号的位置可能是获得07600000(在您的情况下)之间的区别。

    【讨论】:

    • 我曾经有这样的“newduty = (long unsigned int) period*(power/100);”认为它会解决类型转换问题。我不想将它存储为双精度,我需要它是非浮点数,因为我将它写入接收整数的 /sys/class/pwm 。将“newduty = (long unsigned int) period*(power/100.0f);”可以修吗?
    • 好的,将 100 转换为 100.0f,然后将类型转换回 long unsigned int 效果很好。谢谢!
    • @napierzaza 这不是强制转换问题,而是整数除法问题。因为(76/100) &lt; 1,它会将0 放入您的等式中。如果您必须坚持使用整数,只需执行(power*period)/100) 这将为您提供相当准确的结果,因为power*period 在除法之前会变成一个大数。
    【解决方案2】:

    制作newduty and power as double。因为整数类型它给出 0

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 2017-09-10
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2016-12-20
      • 1970-01-01
      相关资源
      最近更新 更多