未签名包装计时器的经过时间

时间:2016-01-05 23:42:53

标签: math timer overflow underflow

考虑我有一个定时器,它返回一个uint32_t值(代表一些滴答),总是向上计数,并在到达UINT32_MAX后回到0。

假设我需要花费从时间a到时间b的经过时间,并且我不知道计时器最初可能有多高以及它是否会在{{1 }和aba都是b类型,并被分配到计时器的返回值。

这是一个正确的陈述,只要不超过UINT32_MAX滴答,我们就可以uint32_t获取经过的时间 - 并且即使定时器包裹一次也能正确吗?这有什么证据?

1 个答案:

答案 0 :(得分:1)

令N = 2 32 。设A和B是包装到[0,N]范围之前的开始和结束的时间戳,并假设A≤B<1。 A + N.然后a = A%N和b = B%N。我们有兴趣计算持续时间D = B - A.

当a≤b时,D = B - A = b - a

是微不足道的

什么时候&gt; B'然后a≤b+ N且必须是D = B - A = b + N - a。

但是b - a当然是全等的b + N - 模N.由于std::uint32_t之间的加法和减法都是模N,你可以安全地将答案计算为D = b - a。两个std::uint32_t值之间的减法运算符已经是std::uint32_t,因此没有理由在(std::uint32_t)(b - a)中指定强制转换。