2011-11-08 6 views
1

オーバーフローによって相違が正しいかどうかは疑問です。例として、QueryPerformanceFrequency(&ローカル)でWindows高解像度タイマーを使用しようとしています。オーバーフロー後にC++の違いが正しいこと

このカウンタの開始値は未定義です。しかし、興味深いビットは出発点との違いだけです。ですから最初は値を記録してからdiffを見てください。違いがLARGE_INTEGERよりも大きくならないことを保証できれば十分でしょうか?

1つは4ビットです。それは1 ... 15を可能にします。カウンターが14時に開始し、2時に停止し、2 - 14時に、私は4を得ているはずですか?だから、その差が小さければオーバーフローについて心配する必要はありませんか?私のコンピュータ上で

おかげ

+2

これはあなた自身でテストできるものではありませんか? – someguy

+1

@someguy:そうではありません。彼が未定義の振る舞いをすると、テストでは動作しているように見え、最後のコードでは予測できないインスタンスの下で失敗する可能性があります。 – celtschk

答えて

3

Windows固有の構造を使用しているので、Windowsをサポートしているマシン上でのみ実行する必要があるため、問題は簡単です。 Windowsは2の補数演算を必要とし、2の補数の算術演算は期待通りのオーバーフローで動作します(オーバーフローはmod 2^nと計算されます)。

0

少なくとも、LARGE_INTEGERの定義は次のとおりです。

typedef union _LARGE_INTEGER { 
    struct { 
     DWORD LowPart; 
     LONG HighPart; 
    }; 
    LONGLONG QuadPart; 
} LARGE_INTEGER; 

トリッキーな部分が署名されたもののすべてです。したがって、4ビットの場合、範囲は(-8,7)です。次に、6で始まり0で停止すると、-6の差が得られます。

ただし、LONGLONGをunsigned long longにキャストして(減算の前または後のいずれかに問題がない場合)、正解を取得する必要があります。 -6unsigned long longに変換すると、結果は10になります。

+0

それは正しいとは思わない... -6-6 = -12 + 16 = 4 – Cookie

+0

ガー、そして私はこの愚かな単純な方程式をしようとするこの記事のほとんどの時間を過ごした。しかたがない。 –

0

2の補数(コンピュータでの整数の表現方法)を使用すると、複数の数値を加算または減算することができます。のビット数に収まる限り、結果は正確にになります。一時的な結果は、割り当てられたビット数に収まる必要はない。

したがって、Nビットの整数を使用すると、その差が2^N未満であれば正しい結果が得られます。

1

私は一般的な質問に答えるつもりはありませんが、具体的な質問に答えるつもりはありません:QueryPerformanceCounterからのオーバーフローについて心配する必要はありますか?

パフォーマンスカウンタが4 GHzで増加している場合は、63ビット符号付き整数が負の数に折り返されるまでに73年かかります。オーバーフローを心配する必要はありません。

+0

しかし、開始値はどこにも指定されていませんか?システムがゼロで起動した後に起動すると想定できますか? – Cookie

+0

@Cookie、それは指定されていませんが、ゼロから開始するのは意味がありませんか?私はちょうど私自身のシステムをチェックし、カウンターは稼働時間を完全に反映しています。また、周波数は2.8Mhzにすぎないため、オーバーフローする可能性は1400倍になります。 –

関連する問題