【问题标题】:Elapsed time of unsigned wrapping timer无符号包装计时器的经过时间
【发布时间】:2016-01-05 23:42:52
【问题描述】:

假设我有一个计时器,它返回一个uint32_t 值(表示滴答数),始终向上计数,并在达到UINT32_MAX 后返回到 0。

假设我需要从时间a 到时间b 的经过时间,我不知道计时器最初可能有多高以及它是否会在ab 之间换行。 ab 都是 uint32_t 类型,并分配给计时器的返回值。

我们可以用(uint32_t)(b-a) 来获取经过的时间,只要不超过 UINT32_MAX 个滴答,这是一个正确的说法吗?即使计时器转回一次,它是否正确?这有什么证据?

【问题讨论】:

    标签: math timer overflow underflow


    【解决方案1】:

    令 N = 232。设 A 和 B 是开始和结束 before 的时间戳,并假设 A ≤ B

    当 a ≤ b 时,D = B - A = b - a 是微不足道的。

    当 a > b 时呢?那么a ≤ b + N 一定是D = B - A = b + N - a。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2020-12-01
      相关资源
      最近更新 更多