我使用一个16位的目标平台上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,虽然我失去了好处水流量:
#define UPDATE_PERIOD_cy (uint16_t)((uint32_t)F_CPU*60/((uint32_t)MIN_UPDATES_PER_REV*MAX_RPM)))
我可以强制gcc在常量折叠期间处理大的中间值吗?
我可以强制预处理器为我做不断折叠吗?
我应该知道哪些最佳实践?
你知道谁提供这个编译器吗?你有没有试图要求他们修复? – ddbug
编译器运行正常。我希望找到一种方式,使其行为方式不正确,但稍微方便一些。 – fkoran