考虑我有一个定时器,它返回一个uint32_t
值(代表一些滴答),总是向上计数,并在到达UINT32_MAX
后回到0。
假设我需要花费从时间a
到时间b
的经过时间,并且我不知道计时器最初可能有多高以及它是否会在{{1 }和a
。 b
和a
都是b
类型,并被分配到计时器的返回值。
这是一个正确的陈述,只要不超过UINT32_MAX滴答,我们就可以uint32_t
获取经过的时间 - 并且即使定时器包裹一次也能正确吗?这有什么证据?
答案 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)
中指定强制转换。