Yani, .NET performance counter type'un rahatsız edici bir sorunu olduğu anlaşılıyor: Pencerede gerçek perf sayaç değeri imzasız ve negatif olamazken, sayaç HamValue için long
ortaya çıkıyor. Örneğin, bir NumberOfItems64 sayacınız varsa API, negatif bir değeri kabul etmekten mutluluk duyar, sonra sessizce çok büyük bir sayıya dönüştürür. Aslında sayacın değer aralığının yarısı için, onu ayarlamanın tek yolu, geçmek için doğru negatif değeri bulmaktır!C# 'den uzun bir süre için kopya bitleri C#
Burada olan bitenin, long
numaralı ham bitleri alıp imzasız bir 64 bitlik sayı olarak işledikleri var. İkili tamamlayıcının negatif değerleri sadece sayaç için düz bir sayı olarak okunur.
long
içine
ulong
gelen bitleri bırakarak içine C# zorlamak anlamaya çalışıyorum. Ama C# burada çok yararlı oluyor ...
Convert.ToInt64(ulong)
'u kullanamazsınız veya kullanamazsınız çünkü fazla büyük olduğundan taşma istisnaları atar. Ben dönüşüm yaparak bu şekilde tökezledi:
Convert.ToInt64(myULong.ToString("X"), 16)
o sayı iki bilgisayarın tamamlayıcı olduğunu varsayar ve bunu gerekenleri yapar olmayan 10 tabanında bir dizeden dönüştürür zaman. Ancak bu, ideal değildir çünkü bir nesneyi ayırması ve her dönüşüm için bir dizeyi ayrıştırması gerekir ve bu API performans açısından kritik öneme sahiptir. Bunu yapmak için C# içinde daha iyi bir yolu var mı?
Bir dökümde taşma istisnası sorununa neden olan bir kod örneği verebilir misiniz? Uzun imzalayabilirim = long.MaxValue; işaretli ++; ulong unsigned = (ulong), istisnasız olarak imzaladı. –
@Will: '/ checked +' ile mi çalışıyorsunuz? Davranış değişebilir. Ayrıca, her ikisi de bitleri koruyarak değeri değiştiren ulong unsigned = (ulong) long.MinValue; ve long sign = (long) ulong.MaxValue; –
@Ben - İyi soru - Sadece Linqpad'i çalıştırıyorum, bu yüzden ayarların ne olduğundan emin değilim. –