タイマーのように 2 つの 8 ビットの符号なし値を使用していると仮定します。停止時刻と開始時刻を記録し、停止から開始を減算して経過時間を取得する場合、ロールオーバーを処理するために mod を使用する必要がありますか?それとも減算はうまくいきますか? たとえば、開始時間 = 11111100 で終了時間 = 00000101 とすると、(00000101 - 11111100) は正しい結果になりますか?
2 に答える
1
あなたの例で、自分で試すことができます:
- 開始時間 = 1111 1100 (= 252)
- 終了時間 = 0000 0101 (= 5)
(5-252) モジュロ 256 = 9。
- 終了時刻 - 開始時刻 = 0000 0101 - 1111 1100 = 0000 1001 (= 9)
もちろん、開始時間と終了時間の差が 256 を超えている場合、これは機能しません。従来のオーバーフローと同様に、「終了時間」が「開始時間」を何回過ぎたかを知ることはできません。
于 2011-01-14T15:01:26.710 に答える
0
はい、減算は期待どおりに機能します。ロールオーバーを処理するために特別なことをする必要はありません。あなたの例では、減算は適切に行われています:
00000101 - 11111100 == 00001001
(5) - (252) == (9)
または:
(5+256) - (252) == (9)
それを証明するには、この Python テストを参照してください。
>>> all((j - i) & 0xFF == ((j & 0xFF) - i) & 0xFF
... for i in range(256)
... for j in range(i, i + 256))
True
項はの場合j & 0xFF
よりも小さくなります。これは 8 ビットの結果には影響しません。これは、これらの値が、が 8 ビットにマスクされていない場合の結果と一致していることを示しています。i
j > 255
j
于 2011-01-14T14:54:51.930 に答える