Подтвердить что ты не робот

Скопируйте биты из 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 будет критичным по производительности. Есть ли лучший способ в С# сделать это?

4b9b3361

Ответ 1

Простое литье, подобное

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

точно сохраняет бит в значении.