12

そのため、.NET パフォーマンス カウンター タイプには厄介な問題があるようですlong。Windows の実際のパフォーマンス カウンター値は符号なしであり、負になることはありませんが、RawValue カウンターに公開されます。たとえば、NumberOfItems64 カウンターがある場合、API は負の値を完全に受け入れて、黙って非常に大きな数に変換します。実際、カウンタの値の範囲の半分を設定する唯一の方法は、渡す正しい負の値を見つけることです!

ここで起こっていることは、から生のビットを取得し、longそれを符号なしの 64 ビット数として扱っていることだと思います。2 の補数からの負の値は、カウンターの正数値として読み取られます。

だから私は、APIが望んでいるので、 C#をulongストレートからビットにドロップするように強制する方法を理解しようとしています。しかし、ここでは C# が役に立ちすぎています...値が大きすぎるためにオーバーフロー例外がスローされるため、longキャストしたり使用したりすることはできません。Convert.ToInt64(ulong)私は変換を行うこの方法に出くわしました:

Convert.ToInt64(myULong.ToString("X"), 16)

非基数 10 の文字列から変換すると、数値が 2 の補数であると想定され、必要な処理が行われます。ただし、変換ごとにオブジェクトを割り当てて文字列を解析する必要があり、この API はパフォーマンスが重要になるため、理想的ではありません。C#でこれを行うためのより良い方法はありますか?

4

1 に答える 1

18

のような単純なキャスト

ulong value1 = 0xFEDCBA9876543210UL;  // 18364758544493064720
long value2 = (long)value1;           // -81985529216486896
ulong value3 = (ulong)value2;         // 18364758544493064720

値のビットを正確に保持します。

于 2012-10-24T19:23:59.593 に答える