在C#中将位从ulong复制到long

时间:2012-10-24 19:22:10

标签: c# .net type-conversion

所以看起来.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#中有更好的方法吗?

1 个答案:

答案 0 :(得分:18)

这样的简单演员
ulong value1 = 0xFEDCBA9876543210UL;  // 18364758544493064720
long value2 = (long)value1;           // -81985529216486896
ulong value3 = (ulong)value2;         // 18364758544493064720

准确保留值中的位。