임베디드 C/C++ 환경에서 간단한 변수 조작을 시도하고 있습니다. 어떤 이유로 나는 결과적으로 제로를 일관되게 얻고 있습니다. 여기 C long 부호없는 int 번호 조작
내가 그래서 수신 번호가 내가 아는 (76)가 첫 번째 장애물 과거를 만드는 것입니다 것을 알고, 그리고1 new power 76
2 new power 76
3 setduty 0 period 10000000
를받을 출력 코드 여기
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);
}
입니다 둘째. 그러나 어떻게 든 간단한 수학 방정식에서는 0이됩니다. "기간"은 서명되지 않은 긴 int이며 클래스 def에서 선언되지만 출력이 적절하다는 것을 알 수 있습니다.
왜이 값이 지속적으로 0이 될까요? 없어진 물건 있어요? 더 큰 숫자를 위해 특별한 것을 포함 할 필요가 있을까요? 아니면 서명되지 않은 긴 정수 나 간단한 연산자를 사용할 수 있습니까?
커널 레벨 pwm을 사용하고 있기 때문에 높은 숫자 (x < = 10,000,000)를 다루고 있습니다.
나는 "newduty = (long unsigned int) period * (power/100);"처럼 사용했다. 그것이 타입 캐스팅 문제를 해결할 것이라고 생각했습니다. 이중으로 저장하고 싶지 않다. 정수를받는/sys/class/pwm에 쓰기 때문에 float이 아니어야한다. "newduty = (long unsigned int) 마침표 * (power/100.0f);" 아마도 고칠 수 있을까요? – napierzaza
100을 100.0f로 만든 다음 long unsigned int로 다시 캐스팅하면 잘 작동합니다. 감사! – napierzaza
@napierzaza 캐스팅 문제가 아니며 정수 문제입니다. '(76/100) <1'이기 때문에 당신의 평등에'0'을 넣습니다. 정수로 고수해야한다면'power (power * period)/100 '을 쓰면됩니다. 이것은'power * period '가 나누기 전에 큰 숫자가되기 때문에 합당한 정확한 결과를 줄 것입니다. – Benj