Лучше всего использовать маскировку и смещение.long гарантированно будет 64-битным и int-32-битным, согласно документации, так что вы можете замаскировать биты на два целых числа и затем рекомбинировать.
См .:
static int[] long2doubleInt(long a) {
int a1 = (int)(a & uint.MaxValue);
int a2 = (int)(a >> 32);
return new int[] { a1, a2 };
}
static long doubleInt2long(int a1, int a2)
{
long b = a2;
b = b << 32;
b = b | (uint)a1;
return b;
}
static void Main(string[] args)
{
long a = 12345678910111213;
int[] al = long2doubleInt(a);
long ap = doubleInt2long(al[0],al[1]);
System.Console.WriteLine(ap);
System.Console.ReadKey();
}
Примечаниеиспользование побитовых операций во всем.Это позволяет избежать проблем, которые могут возникнуть при использовании сложения или других числовых операций, которые могут возникнуть при использовании отрицательных чисел или ошибок округления.
Обратите внимание, что вы можете заменить int на uint в приведенном выше коде, если вы можете использовать целые числа без знака (это всегда предпочтительнее в такой ситуации, так как намного яснее, что происходит с битами).