gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:39:44 24 4
gpt4 key购买 nike

看来 .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# 中是否有更好的方法来执行此操作?

最佳答案

像这样的简单转换

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

准确保留值中的位。

关于c# - 在 C# 中将位从 ulong 复制到 long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com