我在 16 位目标平台上使用 avr-gcc
我想做这样的事情:
#define F_CPU 16000000
#define MIN_UPDATES_PER_REV 100
#define MAX_RPM 10000
#define UPDATE_PERIOD_cy ( F_CPU*60 / (MIN_UPDATES_PER_REV*MAX_RPM) )
正如预期的那样,我收到一个溢出错误,因为 MIN_UPDATES_PER_REV*MAX_RPM 的计算结果为 0xf4240:
bldc.h:9:40: warning: integer overflow in expression [-Woverflow]
#define UPDATE_PERIOD_cy ( F_CPU*60 / (MIN_UPDATES_PER_REV*MAX_RPM) )
^
如果我将常量强制为 32 位并在折叠后转换回 uint16_t,事情就会解决,尽管我失去了 -Woverflow 的好处:
#define UPDATE_PERIOD_cy (uint16_t)( (uint32_t)F_CPU*60 / ((uint32_t)MIN_UPDATES_PER_REV*MAX_RPM) ))
我可以强制 gcc 在恒定折叠期间处理较大的中间值吗?
我可以强制预处理器为我做持续折叠吗?
是否有我应该了解的最佳实践?