0

uint32_t値 (ティック数を表す)を返し、常にカウントアップし、到達後に 0 にラップするタイマーがあるとしますUINT32_MAX

ときどき の経過時間をa計測する必要があるとします。タイマーが最初にどの程度高くなるか、および と の間でbラップするかどうかはわかりません。とはどちらも型であり、タイマーの戻り値に割り当てられます。ababuint32_t

(uint32_t)(b-a)UINT32_MAX ティックを超えて経過していない限り、経過時間を取得するために使用できるステートメントは正しいですか? また、タイマーが 1 回ラップしたとしても正しいでしょうか? これの証拠は何ですか?

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。2 つの値の間の減算演算子std::uint32_tは既に であるstd::uint32_tため、キャストを in のように指定する理由はありません(std::uint32_t)(b - a)

于 2016-01-06T00:51:11.487 に答える