因此,看来.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的字符串转换时,它假定数字为2的补码,然后执行我需要的操作。但这并不理想,因为它需要为每个转换分配一个对象并解析一个字符串,并且此API将对性能至关重要。 C#中有没有更好的方法可以做到这一点?
最佳答案
一个简单的类型转换
ulong value1 = 0xFEDCBA9876543210UL; // 18364758544493064720
long value2 = (long)value1; // -81985529216486896
ulong value3 = (ulong)value2; // 18364758544493064720
精确地保留值中的位。