Quiero convertirme longa 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

myIntValuepuede terminar negativo cuandomyLongValuees positivo (4294967294 => -2) y viceversa (-4294967296 => 0). Por lo tanto, al implementar unaCompareTooperación, por ejemplo, no puede emitir felizmente el resultado de restar unolongde otro a uninty devolverlo; para algunos valores, su comparación arrojaría un resultado incorrecto.new Random()usosEnvironment.TickCountdebajo del capó; No es necesario sembrar manualmente con los tics del reloj.unchecked, entonces, a menos que lo haya cambiado explícitamente, entonces launcheckedpalabra clave (como se muestra en esta respuesta y el comentario de @ ChrisMarisic, etc.) no es necesaria, yint myIntValue = (int)myLongValuees exactamente equivalente. Sin embargo, tenga en cuenta que independientemente de si usa launcheckedpalabra 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.aspxConvertno es bueno.if (value > Int32.MaxValue)return Int32.MaxValue;elsereturn 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
GetHashCodees 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
0xFFFFFFFFvalor de Máscara de bits ( ) dependerá del tamaño de Int porque el tamaño Int depende de la máquina.fuente
uncheckedcontexto no obtendrá un desbordamiento, pero no necesita enmascararseuncheckedpara evitar el desbordamiento, por lo que solo se necesita una solución encheckedcontexto.] 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
longValuerepresentable más cercanointsi 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.MinValuetambié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