Скопируйте биты из ulong в long в С#
Итак, похоже, что тип счетчика .NET имеет раздражающую проблему: он предоставляет long
для счетчика RawValue, в то время как фактическое значение счетчика перца в окнах unsigned и не может быть отрицательным. Например, если у вас есть счетчик NumberOfItems64, API будет полностью счастлив принять отрицательное значение, а затем без проблем преобразует его в очень большое число. Фактически для половины диапазона значений счетчика единственный способ установить его - найти правильное отрицательное значение, которое нужно пройти!
Я предполагаю, что здесь происходит то, что они берут исходные биты из long
и рассматривают его как 64-битное число без знака. Отрицательные значения из двух дополнений считываются только как прямое число для счетчика.
Итак, я пытаюсь понять, как принудить С# просто отбрасывать биты из ulong
прямо в long
, так как это то, чего хочет API. Но С# здесь слишком полезен... вы не можете использовать или использовать Convert.ToInt64(ulong)
, поскольку он выдает исключения переполнения из-за слишком большого значения. Я наткнулся на этот способ выполнения преобразования:
Convert.ToInt64(myULong.ToString("X"), 16)
Когда он преобразуется из строки в не-base 10, он предполагает, что число находится в двух дополнениях и делает то, что мне нужно. Но это не идеально, потому что ему нужно выделить объект и проанализировать строку для каждого преобразования, и этот API будет критичным по производительности. Есть ли лучший способ в С# сделать это?
Ответы
Ответ 1
Простое литье, подобное
ulong value1 = 0xFEDCBA9876543210UL; // 18364758544493064720
long value2 = (long)value1; // -81985529216486896
ulong value3 = (ulong)value2; // 18364758544493064720
точно сохраняет бит в значении.