2012-10-24 31 views
11

Vì vậy, có vẻ như .NET performance counter type có vấn đề khó chịu: nó phơi bày long cho bộ đếm RawValue trong khi giá trị bộ đếm thực tế trong cửa sổ không được ký và không được âm. Ví dụ nếu bạn có một bộ đếm NumberOfItems64 API sẽ hoàn toàn vui vẻ chấp nhận một giá trị âm, sau đó âm thầm chuyển đổi nó thành một số rất lớn. Trong thực tế cho một nửa phạm vi giá trị của bộ đếm cách duy nhất để thiết lập nó là tìm đúng giá trị âm để vượt qua!Sao chép các bit từ ulong đến dài trong C#

Tôi cho rằng những gì đang xảy ra ở đây là chúng đang lấy các bit thô từ long và xử lý nó dưới dạng số 64 bit chưa ký. Các giá trị âm từ bổ sung của hai chỉ được đọc như một số thẳng lên cho bộ đếm.

Vì vậy, tôi đang cố gắng tìm ra cách ép buộc C# chỉ cần thả các bit từ số ulong thẳng vào long, vì đó là những gì API muốn. Nhưng C# là quá hữu ích ở đây ... bạn không thể bỏ hoặc sử dụng Convert.ToInt64(ulong) vì nó ném ngoại lệ tràn vì giá trị quá lớn. Tôi stumbled khi cách này làm việc chuyển đổi:

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

Khi nó chuyển đổi từ một chuỗi trong phi-base 10 nó giả định con số này trong bổ sung hai và làm những gì tôi cần nó. Nhưng nó không lý tưởng vì nó cần phân bổ một đối tượng và phân tích cú pháp một chuỗi cho mọi chuyển đổi và API này sẽ trở nên quan trọng về hiệu suất. Có cách nào tốt hơn trong C# để làm điều này?

+0

Bạn có thể đưa ra ví dụ về mã gây ra sự cố ngoại lệ tràn trên dàn diễn viên không? Tôi có thể làm 'long signed = long.MaxValue; đã ký ++; ulong unsigned = (ulong) đã ký, 'không có ngoại lệ. –

+1

@Will: Bạn có đang biên dịch bằng '/ checked +' không? Hành vi có thể thay đổi. Ngoài ra, bạn chỉ có thể nói 'ulong unsigned = (ulong) long.MinValue;' và 'long signed = (long) ulong.MaxValue;', cả hai đều giữ bit nhưng thay đổi giá trị. –

+0

@Ben - Câu hỏi hay - Tôi chỉ chạy Linqpad, vì vậy tôi không chắc cài đặt của nó là gì. –

Trả lời

18

Một dàn diễn viên đơn giản như

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

bảo tồn các bit trong giá trị chính xác.

+1

Không, tôi muốn sao chép các bit từ một ulong đến một thời gian dài, không chuyển đổi từ lâu thành ulong. – RandomEngy

+6

Điều này sẽ thực hiện chuyển đổi nhị phân các bit. Bạn không chắc chắn tại sao điều này lại bị giảm giá. Sao chép các bit giống như chuyển đổi. Bạn có thể muốn thêm 'unchecked (...)'. – usr

+1

@usr Tôi đã downvoted bản chỉnh sửa gốc (trước khi một ninja sản xuất phiên bản hiện tại), bởi vì dàn diễn viên đi sai hướng. +1 cho 'không được chọn'. –

Các vấn đề liên quan