Quiero convertirme longa int.
Si el valor de long> int.MaxValue, estoy feliz de dejarlo envolver.
¿Cuál es la mejor manera?
Quiero convertirme longa int.
Si el valor de long> int.MaxValue, estoy feliz de dejarlo envolver.
¿Cuál es la mejor manera?
Respuestas:
Solo hazlo (int)myLongValue. Hará exactamente lo que desee (descartar MSB y tomar LSB) en uncheckedcontexto (que es el valor predeterminado del compilador). Se lanzará OverflowExceptionen checkedcontexto si el valor no cabe en un int:
int myIntValue = unchecked((int)myLongValue);
new Random()usos Environment.TickCountdebajo del capó; No es necesario sembrar manualmente con los tics del reloj.
unchecked, entonces, a menos que lo haya cambiado explícitamente, entonces la uncheckedpalabra clave (como se muestra en esta respuesta y el comentario de @ ChrisMarisic, etc.) no es necesaria, y int myIntValue = (int)myLongValuees exactamente equivalente. Sin embargo, tenga en cuenta que independientemente de si usa la uncheckedpalabra 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 el checked(...)contexto, donde esos casos arrojarán una excepción.
Convert.ToInt32(myValue);
Aunque no sé qué hará cuando sea mayor que int.MaxValue.
OverflowException, que es exactamente lo que el OP no quiere: msdn.microsoft.com/en-us/library/d4haekc4.aspx
Convertno 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:
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
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 use GetHashCode, 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 ...
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
El 0xFFFFFFFFvalor de Máscara de bits ( ) dependerá del tamaño de Int porque el tamaño Int depende de la máquina.
uncheckedcontexto no obtendrá un desbordamiento, pero no necesita enmascararse uncheckedpara evitar el desbordamiento, por lo que solo se necesita una solución en checkedcontexto.] 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
Método Convert.ToInt32
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:
long[] numbers = { Int64.MinValue, -1, 0, 121, 340, Int64.MaxValue };
int result;
foreach (long number in numbers)
{
try {
result = Convert.ToInt32(number);
Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
number.GetType().Name, number,
result.GetType().Name, result);
}
catch (OverflowException) {
Console.WriteLine("The {0} value {1} is outside the range of the Int32 type.",
number.GetType().Name, number);
}
}
// The example displays the following output:
// The Int64 value -9223372036854775808 is outside the range of the Int32 type.
// Converted the Int64 value -1 to the Int32 value -1.
// Converted the Int64 value 0 to the Int32 value 0.
// Converted the Int64 value 121 to the Int32 value 121.
// Converted the Int64 value 340 to the Int32 value 340.
// The Int64 value 9223372036854775807 is outside the range of the Int32 type.
Aquí hay una explicación más larga.
No
(int) Math.Min(Int32.MaxValue, longValue)
ser la forma correcta, matemáticamente hablando?
longValuerepresentable más cercano intsi 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 con Int32.MinValuetambién. Sin embargo, el póster original no parecía querer sujetarlo.
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.