Quiero convertirme long
a int
.
Si el valor de long
> int.MaxValue
, estoy feliz de dejarlo envolver.
¿Cuál es la mejor manera?
c#
types
int
type-conversion
long-integer
A pesar de
fuente
fuente
myIntValue
puede terminar negativo cuandomyLongValue
es positivo (4294967294 => -2
) y viceversa (-4294967296 => 0
). Por lo tanto, al implementar unaCompareTo
operación, por ejemplo, no puede emitir felizmente el resultado de restar unolong
de otro a unint
y devolverlo; para algunos valores, su comparación arrojaría un resultado incorrecto.new Random()
usosEnvironment.TickCount
debajo del capó; No es necesario sembrar manualmente con los tics del reloj.unchecked
, entonces, a menos que lo haya cambiado explícitamente, entonces launchecked
palabra clave (como se muestra en esta respuesta y el comentario de @ ChrisMarisic, etc.) no es necesaria, yint myIntValue = (int)myLongValue
es exactamente equivalente. Sin embargo, tenga en cuenta que independientemente de si usa launchecked
palabra clave o no, está obteniendo el comportamiento de truncamiento grosero no matemático descrito por @TJCrowder, donde el signo puede voltearse en algunos casos de desbordamiento. La única forma de garantizar realmente la corrección matemática es utilizar elchecked(...)
contexto, donde esos casos arrojarán una excepción.Aunque no sé qué hará cuando sea mayor que int.MaxValue.
fuente
OverflowException
, que es exactamente lo que el OP no quiere: msdn.microsoft.com/en-us/library/d4haekc4.aspxConvert
no es bueno.if (value > Int32.MaxValue)
return Int32.MaxValue;
else
return Convert.ToInt32( value );
A veces no estás realmente interesado en el valor real, sino en su uso como suma de comprobación / código hash . En este caso, el método incorporado
GetHashCode()
es una buena opción:fuente
GetHashCode
es una opción adecuada. Si busca una suma de comprobación persistente , un valor que será el mismo cuando ejecute su aplicación más tarde, no lo useGetHashCode
, ya que no se garantiza que sea el mismo algoritmo para siempre.La forma más segura y rápida es usar Bit Masking antes de lanzar ...
El
0xFFFFFFFF
valor de Máscara de bits ( ) dependerá del tamaño de Int porque el tamaño Int depende de la máquina.fuente
unchecked
contexto no obtendrá un desbordamiento, pero no necesita enmascararseunchecked
para evitar el desbordamiento, por lo que solo se necesita una solución enchecked
contexto.] Ejemplo para 16 bits. Presas firmadas de 16 bits (-32768, 32767). El enmascaramiento con 0xFFFF permite valores de hasta 65535, lo que provoca un desbordamiento, IIRC. Podría enmascarar para evitar el bit de signo, 0x7FFF o 0x7FFFFFFF, si solo desea positivo.Se puede convertir por
Pero arrojará una Excepción de desbordamiento si el valor está fuera del rango del Tipo Int32. Una prueba básica nos mostrará cómo funciona:
Aquí hay una explicación más larga.
fuente
No
ser la forma correcta, matemáticamente hablando?
fuente
longValue
representable más cercanoint
si el valor original es demasiado grande. Pero carece del mismo tratamiento de entradas demasiado negativas, lo que en su lugar perdería los bits más significativos; Tendría que comparar conInt32.MinValue
también. Sin embargo, el póster original no parecía querer sujetarlo.La siguiente solución se truncará en int.MinValue / int.MaxValue si el valor está fuera de los límites de Integer.
fuente
Una forma posible es usar el operador de módulo para dejar que los valores permanezcan en el rango int32 y luego convertirlo en int.
fuente