C长无符号整数操作

C长无符号整数操作,c,embedded,int,long-integer,unsigned,C,Embedded,Int,Long Integer,Unsigned,我试图在嵌入式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);

我试图在嵌入式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);
}
所以我知道收到的号码是76。我知道他能跨过第一关和第二关。但在简单的数学方程中,它变成了零。“period”也是一个长的无符号int,在类def中声明,但是您可以看到输出是适当的

为什么会一直下降到零?少了什么?我是否需要为较大的数字包含一些特殊的内容,或者我不能对长无符号int或其他内容使用简单运算符*和/或


我处理的是大数(x你遇到的问题是,
power
是一个整数,所以当你
/100
时,你实际上得到了一个
0
的结果,这是因为

根据您的精度要求,将
power
设置为double可能就足够了,但是请注意
(power/100)*period
通常会产生分数结果,因此也可能需要将结果存储为double


如果必须坚持使用整数,只需执行
((幂*周期)/100)
这将为您提供一个相当准确的结果,因为在除法将任何东西变成
0
之前,
power*period
变为一个大数字。对于整数除法,括号的位置可能是获得
0
7600000
之间的差异(在您的情况下).

您遇到的问题是,
是一个整数,因此当您
/100
时,实际上根据的规则,您得到的结果是
0
。这意味着当您将其乘以
周期
时,整个结果是
0

根据您的精度要求,将
power
设置为double可能就足够了,但是请注意
(power/100)*period
通常会产生分数结果,因此也可能需要将结果存储为double


如果必须坚持使用整数,只需执行
((幂*周期)/100)
这将为您提供一个相当准确的结果,因为在除法将任何东西变成
0
之前,
power*period
变为一个大数字。对于整数除法,括号的位置可能是获得
0
7600000
之间的差异(在您的情况下).

新任务和功率设为双精度
。由于整数类型,它给出0

新任务和功率设为双精度
。由于整数类型,它给出0

,我以前使用的是这样的“新任务=(长无符号整数)周期*(功率/100);”我认为它可以解决类型转换问题。我不想将其存储为double,我需要它是非浮点的,因为我正在将它写入接收整数的/sys/class/pwm。将“newduty=(长无符号整数)period*(power/100.0f);”可能会修复吗?好的,将100转换为100.0f,然后将类型转换回长无符号整数效果很好。谢谢!@napierzaza这不是一个转换问题,而是一个整数除法问题。因为
(76/100)<1
,它将
0
放入你的等式中。如果你必须使用整数,只需执行
(幂周期)/100)
这会给你一个相当准确的结果,因为在除法之前,
power*period
是一个很大的数字。我以前用过这样的“newduty=(long unsigned int)period*(power/100);”认为它可以解决类型转换问题。我不想将它存储为double,我需要它是非浮点的,因为我正在将它写入接收整数的/sys/class/pwm。“newduty=(长无符号整数)period*(power/100.0f);”是否可能修复它?好的,将100转换为100.0f,然后将类型转换回长无符号整数效果很好。谢谢@napierzaza这不是一个铸造问题,这是一个整数除法问题。因为
(76/100)<1
,它将
0
放入您的等式中。如果必须使用整数,只需执行
(幂*周期)/100)
即可获得相当准确的结果,因为
幂*周期
在除法之前变为一个大数字。
1 new power 76
2 new power 76
3 setduty 0 period 10000000