C 中整数相乘和除法以避免溢出的正确方法是什么?我想确定以
ticks
(以 Hz 为单位)运行的计时器需要多少 freq
才能产生 delay
(以毫秒为单位)。这应该是ticks = freq * delay / 1000
。
但是,那条线对我来说看起来很危险。如果我们写
(freq * delay) / 1000
,我们就会面临溢出的风险。如果我们写 freq * (delay / 1000)
,我们就会陷入浮点数——这是不必要的并且容易出错,尤其是。在微控制器上。
正确的做法是什么?
简单地想一下您可以延迟多长时间。
如果使用 32 位无符号数(延迟的负数不太实用,因为我不知道如何产生负延迟,这会让我们回到过去)。 uint32_t 的最大值为 4,294,967,295,足以满足超过 1 小时的延迟。
如果您需要更多,请在计算中使用更大的无符号整数:
((uint64_t)freq * delay) / 1000