我需要将一个参数作为两个 int 参数传递给 Telerik Report,因为它不能接受长参数。将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么?
使用掩蔽和移位是最好的选择。根据文档,long 保证为 64 位,int 保证为 32 位,因此您可以将这些位屏蔽为两个整数,然后重新组合。
See:
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 (在这种情况下这总是更好的选择,因为它更清楚这些位发生了什么)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)