Sin embargo, tenga en cuenta que los números grandes (generalmente más grandes 2147483647y más pequeños que -2147483648) perderán algunos de los bits y se representarán incorrectamente.
Por ejemplo, 2147483648se representaría como -2147483648.
@khachik Creo que la precisión es 1. O tal vez 42, por supuesto :)
extraneon
77
La fundición tiene diferentes significados para los objetos y para los tipos primitivos. (int) No trato de tratar un entero de 64 bits como un entero de 32 bits, en realidad devuelve un entero de 32 bits diferente con los mismos 32 bits de orden inferior. Con los objetos, se lanza a una clase secundaria más específica, pero con los tipos primitivos, un lanzamiento no es realmente un lanzamiento, sino una conversión.
dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Si una conversión no detecta en este caso que x tiene un valor incorrecto, entonces no tiene una solución.
raisercostin
Math.toIntExact () es un gran método en realidad. Lanza una excepción si el valor es demasiado grande para caber en un int. Gracias por la sugerencia.
¿Cuál es la diferencia entre esta forma y simplemente emitir el valor? Creo que todo lo que intValue()hace aquí en segundo plano es emitir el valor ... ¿Verdad?
Tim Wißmann
1
Tenga en cuenta los tipos. No es un primitivo longaquí. Es el tipo de referencia Longque no puede emitir directamente a una primitiva int. int y = (int)x;arrojará una ejecución pero int y = (int)(long)xfuncionará. (El motivo es el autoboxing)
akop
58
Para valores pequeños, el casting es suficiente:
long l =42;int i =(int) l;
Sin embargo, un longpuede contener más información que un int, por lo que no es posible convertir perfectamente de longa int, en el caso general. Si longtiene un número menor o igual a Integer.MAX_VALUEusted, puede convertirlo lanzando sin perder ninguna información.
Por ejemplo, el siguiente código de muestra:
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 2147483647long x=2147483648int y=-2147483648
Observe el signo negativo en y. Debido a que xtenía un valor uno mayor que Integer.MAX_VALUE, int yno se pudo retener. En este caso se envolvió con los números negativos.
Si desea manejar este caso usted mismo, puede 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 números positivos. Para números negativos, use en MIN_VALUElugar de `MAX_VALUE '
Entonces, una conversión adecuada será detectar si la conversión es segura y lanzar una excepción de lo contrario. Hecho declarado por @Andrej Herich que sugirió la biblioteca Guava.
raisercostin
55
Desde Java 8 puede usar: Math.toIntExact (valor largo)
@Grekz eso depende del OP. Lo haría en este caso. Más tarros de dependencia es mejor que ruedas más reinventadas a menos que tenga una razón real para no tener más tarros de dependencia.
djechlin
1
En mi humilde opinión, esta respuesta es mucho mejor que la aceptada, ya que nunca hace algo inesperado.
Mark Slater
55
Como mi proyecto ya incluye ese frasco, sería más beneficioso usarlo que escribir un nuevo ayudante
Osify
24
long x =3;int y =(int) x;
pero eso supone que longse puede representar como un int, ¿sabes la diferencia entre los dos?
Es interesante saber que, de acuerdo con el párrafo 5.1.3 en java.sun.com/docs/books/jls/third_edition/html/… (The Java Language Spec): a pesar del hecho de que el desbordamiento, el desbordamiento u otra pérdida de información pueden ocurrir, el estrechamiento de las conversiones entre tipos primitivos nunca da como resultado una excepción en tiempo de ejecución (§11).
extraneon
19
Puede usar el Longcontenedor en lugar de longprimitivo y llamar
Puede ser una buena idea vincular a la documentación actual, así como ampliar sobre esto; inevitablemente, habrá un cierto grado de redondeo al convertir un largo a un int.
Makoto
2
En cuanto a la implementación de Java 7 de Long.intValue (), es solo una conversión. No se implementa ninguna comprobación de bajo / desbordamiento. Entonces, al menos a través de Java 7, esta opción es equivalente a solo: (int) someLong.
buzz3791
¿Por qué menos votos a favor? Encontré esta una de las respuestas más valiosas
Anand j. Kadhi
3
Si la transmisión directa muestra un error, puede hacerlo así:
En Java, un largo es un número de 64 bits con signo, lo que significa que puede almacenar números entre -9,223,372,036,854,775,808 y 9,223,372,036,854,775,807 (inclusive).
Un int, por otro lado, es 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).
Entonces, si su tiempo está fuera de los valores permitidos para un int, no obtendrá una conversión valiosa.
Detalles sobre los tamaños de los tipos primitivos de Java aquí:
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. Lo que hice entonces. Si crees 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 "aporte" ...
Alexis Dufrenoy
1
En Java 8 lo hago de la siguiente manera
long l =100L;int i =Math.toIntExact(l);
Este método arroja ArithmaticExceptionsi el longvalor excede el rango de int. Por lo tanto, estoy a salvo de la pérdida de datos.
En primavera, hay una forma rigurosa de convertir un largo a int
no solo lnog se puede convertir en int, cualquier tipo de clase se extiende El número se puede convertir a otro tipo de Número en general, aquí le mostraré cómo convertir un largo a int, otro tipo viceversa.
Long l =1234567L;int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l,Integer.class);
Respuestas:
Actualizado, en Java 8:
Respuesta original
El tipo de conversión simple debería hacerlo:
Sin embargo, tenga en cuenta que los números grandes (generalmente más grandes
2147483647
y más pequeños que-2147483648
) perderán algunos de los bits y se representarán incorrectamente.Por ejemplo,
2147483648
se representaría como-2147483648
.fuente
fuente
intValue()
hace aquí en segundo plano es emitir el valor ... ¿Verdad?long
aquí. Es el tipo de referenciaLong
que no puede emitir directamente a una primitivaint
.int y = (int)x;
arrojará una ejecución peroint y = (int)(long)x
funcionará. (El motivo es el autoboxing)Para valores pequeños, el casting es suficiente:
Sin embargo, un
long
puede contener más información que unint
, por lo que no es posible convertir perfectamente delong
aint
, en el caso general. Silong
tiene un número menor o igual aInteger.MAX_VALUE
usted, puede convertirlo lanzando sin perder ninguna información.Por ejemplo, el siguiente código de muestra:
produce el siguiente resultado en mi máquina:
Observe el signo negativo en
y
. Debido a quex
tenía un valor uno mayor que Integer.MAX_VALUE,int y
no se pudo retener. En este caso se envolvió con los números negativos.Si desea manejar este caso usted mismo, puede hacer algo como:
Todo esto supone números positivos. Para números negativos, use en
MIN_VALUE
lugar de `MAX_VALUE 'fuente
Desde Java 8 puede usar: Math.toIntExact (valor largo)
Ver JavaDoc: Math.toIntExact
Código fuente de
Math.toIntExact
en JDK 8:fuente
Si usa la biblioteca Guava , hay métodos
Ints.checkedCast(long)
yInts.saturatedCast(long)
para convertirlong
aint
.fuente
pero eso supone que
long
se puede representar como unint
, ¿sabes la diferencia entre los dos?fuente
Puede usar el
Long
contenedor en lugar delong
primitivo y llamarDocumentos de Java7 intValue ()
Redondea / trunca el
long
valor en consecuencia para que quepa en unint
.fuente
Si la transmisión directa muestra un error, puede hacerlo así:
fuente
En Java, un largo es un número de 64 bits con signo, lo que significa que puede almacenar números entre -9,223,372,036,854,775,808 y 9,223,372,036,854,775,807 (inclusive).
Un int, por otro lado, es 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).
Entonces, si su tiempo está fuera de los valores permitidos para un int, no obtendrá una conversión valiosa.
Detalles sobre los tamaños de los tipos primitivos de Java aquí:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
fuente
En Java 8 lo hago de la siguiente manera
Este método arroja
ArithmaticException
si ellong
valor excede el rango deint
. Por lo tanto, estoy a salvo de la pérdida de datos.fuente
Si desea realizar una conversión segura y disfrutar del uso de Java8 con expresión Lambda, puede usarlo como:
fuente
Function<Long,Integer> function =
?largo x = 3120L; // tomar cualquier valor largo int z = x.intValue (); // puedes convertir double a int también de la misma manera
si necesita encubrir directamente entonces
longvalue.intvalue ();
fuente
fuente
En primavera, hay una forma rigurosa de convertir un largo a int
no solo lnog se puede convertir en int, cualquier tipo de clase se extiende El número se puede convertir a otro tipo de Número en general, aquí le mostraré cómo convertir un largo a int, otro tipo viceversa.
fuente