0

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

假设我需要不时a地计算经过的时间b,并且我不知道计时器最初可能有多高以及它是否会在a和之间换行b。两者都是类型a并被分配给计时器的返回值。buint32_t

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

4

1 回答 1

1

令 N = 2 32设 A 和 B 是回绕到 [0, N) 范围之前的开始和结束的时间戳,并假设 A ≤ B < A + N。那么 a = A % N 和 b = B % N。我们感兴趣的是计算持续时间 D = B - A。

当 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值之间的减法运算符已经是 a std::uint32_t,因此没有理由像 in 那样指定强制转换(std::uint32_t)(b - a)

于 2016-01-06T00:51:11.487 回答