2012-10-24 35 views
11

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.

Bu yüzden o API istediği bu yana, sadece düz 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ı?

+0

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ı. –

+1

@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; –

+0

@Ben - İyi soru - Sadece Linqpad'i çalıştırıyorum, bu yüzden ayarların ne olduğundan emin değilim. –

cevap

18

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

gibi basit bir döküm tam değer bit korur.

+1

Hayır, bir ulongdan bit uzunluğunu uzun bir ulonga dönüştürmemek istiyorum. – RandomEngy

+6

Bu, bitlerin ikili dönüşümü yapacaktır. Bunun neden reddedildiğinden emin değil. Bitleri kopyalamak, dönüştürme ile aynıdır. "İşaretlenmemiş (...)" ifadesini eklemek isteyebilirsiniz. – usr

+1

@usr Orijinal düzenlemeyi reddettim (geçerli sürümü üreten ninjadan önce), çünkü cast yanlış yöne gitti. 'Unchecked' için +1. –

İlgili konular