препроцессор буэээ (проблема решена)
Jan. 3rd, 2010 11:41 pm#define R_PU_33 17890UL
#define R_PD_33 988UL
#define ADC_V_REF 2560UL
#define MV_TO_ADC(MV, R_PU, R_PD) (((MV)*(unsigned long)1024UL*(R_PD))/((ADC_V_REF)*((R_PU)+(R_PD))))
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long i=0;
i=MV_TO_ADC(33000UL, R_PU_33, R_PD_33);
printf("%l", i);
return 0;
}
Этот код печатает “68” из-за integer overflow в числителе, несмотря на то, что везде где можно воткнуты unsigned long, и правильный ответ 690.
Что делать? Вручную раскрывать макросы не хочется, их подобных много. Проверено на msvc, gcc и avr-gcc (ATMEL).
no subject
Date: 2010-01-03 11:48 pm (UTC)no subject
Date: 2010-01-04 09:35 am (UTC)