所以看起来.NET performance counter type有一个恼人的问题:它为计数器RawValue公开long
,而windows中的实际性能计数器值是无符号的,不能为负数。例如,如果你有一个NumberOfItems64计数器API将非常乐意接受一个负值,然后静默地将其转换为一个非常大的数字。事实上,对于计数器值范围的一半,设置它的唯一方法是找到正确的负值传递!
我假设这里发生的事情是他们从long
获取原始位并将其视为无符号的64位数。来自二进制补码的负值只是作为计数器的直接数字读取。
所以我试图弄清楚如何强迫C#直接将ulong
的位直接丢弃到long
,因为这就是API想要的。但是C#在这里太有用了......你不能转换或使用Convert.ToInt64(ulong)
,因为它会因为值太大而抛出溢出异常。我偶然发现了这种转换方式:
Convert.ToInt64(myULong.ToString("X"), 16)
当它从非基数10中的字符串转换时,它假设数字是二进制补码,并且我需要它。但它并不理想,因为它需要为每次转换分配一个对象并解析一个字符串,这个API将对性能至关重要。在C#中有更好的方法吗?
答案 0 :(得分:18)
像
这样的简单演员ulong value1 = 0xFEDCBA9876543210UL; // 18364758544493064720
long value2 = (long)value1; // -81985529216486896
ulong value3 = (ulong)value2; // 18364758544493064720
准确保留值中的位。