我使用一個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