所以看来.NET 性能计数器类型 http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx有一个恼人的问题:它暴露了long
对于计数器 RawValue,而 Windows 中的实际性能计数器值是无符号的且不能为负数。例如,如果您有一个 NumberOfItems64 计数器,API 将非常乐意接受负值,然后默默地将其转换为一个非常大的数字。事实上,对于计数器值范围的一半,设置它的唯一方法是找到要传入的正确负值!
我认为这里发生的事情是他们正在从long
并将其视为无符号 64 位数字。二进制补码的负值仅作为计数器的直接数字读取。
所以我试图找出如何强制 C# 从ulong
直接进入long
,因为这就是 API 想要的。但 C# 在这里太有用了……你不能强制转换或使用Convert.ToInt64(ulong)
因为它会因为值太大而引发溢出异常。我偶然发现了这种转换方式:
Convert.ToInt64(myULong.ToString("X"), 16)
当它从非基数 10 的字符串转换时,它假定该数字是二进制补码并执行我需要的操作。但它并不理想,因为它需要为每次转换分配一个对象并解析一个字符串,并且这个 API 将对性能至关重要。 C# 有更好的方法来做到这一点吗?
一个简单的演员表就像
ulong value1 = 0xFEDCBA9876543210UL; // 18364758544493064720
long value2 = (long)value1; // -81985529216486896
ulong value3 = (ulong)value2; // 18364758544493064720
准确保留值中的位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)