2010-12-04 18 views

Respuesta

16
long x = 3; 
int y = (int) x; 

pero eso supone que el long se puede representar como un int, que saben la diferencia entre los dos?

+5

Es interesante saber que de acuerdo con el par 5.1.3 en http://java.sun.com /docs/books/jls/third_edition/html/conversions.html#189955 (Lan de Java Especificación guage): a pesar del hecho de que puede haber desbordamiento, desbordamiento u otra pérdida de información, el estrechamiento de las conversiones entre tipos primitivos nunca da como resultado una excepción de tiempo de ejecución (§11). – extraneon

202

simple conversión de tipos debería hacerlo:

long l = 100000; 
int i = (int) l; 

Nótese, sin embargo, que un gran número (por lo general más grandes que 2147483647 y más pequeño que -2147483648) perderán algunos de los bits y estarían representados de forma incorrecta.

Por ejemplo, 2147483648 se representaría como -2147483648.

+0

¿Cuál es la precisión de los enteros? o_O – khachik

+0

@khachik: creo que la información se intercambió por precisión. Editado ... –

+0

@Paul: sí, lo siento, tienes razón. – Frxstrem

53

Para valores pequeños, la fundición es suficiente:

long l = 42; 
int i = (int) l; 

Sin embargo, un long puede contener más información que un int, por lo que no es posible convertir perfectamente desde long a int, en el caso general. Si el long tiene un número menor o igual a Integer.MAX_VALUE, puede convertirlo por conversión sin perder ninguna información.

Por ejemplo, el siguiente código de ejemplo:

System.out.println("largest long is " + Long.MAX_VALUE); 
System.out.println("largest int is " + Integer.MAX_VALUE); 

long x = (long)Integer.MAX_VALUE; 
x++; 
System.out.println("long x=" + x); 

int y = (int) x; 
System.out.println("int y=" + y); 

produce el siguiente resultado en mi máquina:

largest long is 9223372036854775807 
largest int is 2147483647 
long x=2147483648 
int y=-2147483648 

Aviso el signo negativo en y. Como x tenía un valor uno mayor que Integer.MAX_VALUE, int y no pudo contenerlo. En este caso, se ajusta a los números negativos.

Si quería manejar este caso a sí mismo, es posible hacer algo como:

if (x > (long)Integer.MAX_VALUE) { 
    // x is too big to convert, throw an exception or something useful 
} 
else { 
    y = (int)x; 
} 

Todo esto supone que números positivos. Para números negativos, usar MIN_VALUE en lugar de `MAX_VALUE'

+0

Por lo tanto, una conversión adecuada será detectar si la conversión es segura y lanzar una excepción en caso contrario. Hecho declarado por @Andrej Herich que sugirió la biblioteca Guava. – raisercostin

2

En Java, una larga es un número con signo de 64 bits, lo que significa que puede almacenar números entre -9.223.372.036.854.775.808 y 9,223,372,036,854,775,807 (ambos inclusive).

Un int, por otro lado, tiene un número de 32 bits con signo, lo que significa que puede almacenar un número entre -2,147,483,648 y 2,147,483,647 (inclusive).

Por lo tanto, si su longitud está fuera de los valores permitidos para una int, no obtendrá una conversión valiosa.

detalles sobre el tamaño de los tipos primitivos de Java aquí:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

+0

¿Por qué el voto a favor? –

+1

La pregunta ya estaba respondida en el momento en que la vi, pero no se explicó el tema de los límites de la conversión. Que hice entonces. Si piensas que es "bla bla bla", eso solo significa que eres una especie de genio que puede prescindir de ese tipo de cosas, pero para nosotros, simples humanos, una explicación puede ser útil.Gracias por su "entrada" ... –

12

Usted puede utilizar el contenedor largo en lugar de a largo primitiva y llamada de larga.intValue() http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html#intValue()

redondea/trunca el valor largo para que quepa en un int.

+0

Puede ser una buena idea enlazar a la documentación actual, así como expandir esto; inevitablemente, habrá algún grado de redondeo al convertir un largo a un int. – Makoto

+0

@Makoto tienes razón, no me di cuenta. Está udpatado. – eleonzx

+1

Observando la implementación de Java 7 de Long.intValue(), solo está lanzando. No se implementa ninguna verificación de sub/desbordamiento. Así que al menos a través de Java 7, esta opción es equivalente a solo: (int) someLong. – buzz3791

29

Si se utiliza Guava library, hay métodos Ints.checkedCast(long) y Ints.saturatedCast(long) para convertir long a int.

+3

No es necesario utilizar las bibliotecas – Grekz

+4

@Grekz que depende del OP. Yo lo haría en este caso. Más jarras de dependencia son mejores que las más reinventadas a menos que tengas una razón real para no tener más jarras de dependencia. – djechlin

+1

En mi humilde opinión, esta respuesta es mucho mejor que la aceptada, ya que nunca hace algo inesperado. –

-7

En primavera, hay una manera rigurosa para convertir un largo a int

no sólo lnog se pueden convertir en int, cualquier tipo de clase extiende Número puede convertir a otro tipo Número, en general, aquí te mostraré cómo convertir un largo a int, otro tipo viceversa.

Long l = 1234567L; 
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class); 

convert long to int

+6

Spring puede ser Java, pero Java no es Spring. "En java, there is" es una declaración falsa. – Grod

-4
Long l = 100; 
int i = Math.round(l); 
127
Long x = 100L; 
int y = x.intValue(); 

+2

Yo diría que esta será la mejor manera. – Simmant

+0

¿Cuál es la diferencia entre esta forma y simplemente arrojando el valor? Creo que todo lo que 'intValue()' hace aquí en el fondo está emitiendo el valor ... ¿Verdad? – twity1337

30

Desde Java 8 puede utilizar: Math.toIntExact (valor de largo)

See JavaDoc: Math.toIntExact

Devuelve el valor del argumento largo; lanzando una excepción si el valor se desborda un int.

El código fuente de Math.toIntExact en el JDK 8:

public static int toIntExact(long value) { 
    if ((int)value != value) { 
     throw new ArithmeticException("integer overflow"); 
    } 
    return (int)value; 
} 
4

Si colada directa muestra de error puede hacerlo de esta manera:

Long id = 100; 
int int_id = (int) (id % 100000);