Observe, no entanto, que números grandes (geralmente maiores que 2147483647e menores que -2147483648) perderão alguns bits e seriam representados incorretamente.
Por exemplo, 2147483648seria representado como -2147483648.
@khachik Eu acho que a precisão é 1. Ou talvez 42 é claro :)
extraneon
7
A transmissão tem significados diferentes para objetos e tipos primitivos. (int) l não tenta tratar um número inteiro de 64 bits como um número inteiro de 32 bits, na verdade, retorna um número inteiro diferente de 32 bits com os mesmos 32 bits de ordem inferior. Com objetos, você transmite para uma classe filho mais específica, mas com tipos primitivos, um elenco não é realmente um elenco, mas uma conversão.
Dspyz 06/12/10
Int x = (int) (((longo) inteiro.MAX_INTEGER) +10); Se uma conversão não detectar nesse caso que x tem um valor inadequado, você não terá uma solução.
raisercostin
Math.toIntExact () é um ótimo método, na verdade. Emite uma exceção se o valor for muito grande para caber em um int. Obrigado pela sugestão.
Qual é a diferença entre esse caminho e simplesmente lançar o valor? Eu acho que tudo o que intValue()faz aqui no fundo está lançando o valor .. Certo?
Tim Wißmann
1
Observe os tipos. Não é um primitivo longaqui. É o tipo de referência Longque não pode ser convertido diretamente em um primitivo int. int y = (int)x;lançará uma execução, mas int y = (int)(long)xfuncionará. (A razão é autoboxing)
Akop
58
Para valores pequenos, a conversão é suficiente:
long l =42;int i =(int) l;
No entanto, um longpode conter mais informações que um int, portanto, não é possível converter perfeitamente de longpara int, no caso geral. Se o longnúmero tiver um número menor ou igual a Integer.MAX_VALUEvocê, você poderá convertê-lo lançando sem perder nenhuma informação.
Por exemplo, o seguinte código de exemplo:
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);
produz a seguinte saída na minha máquina:
largest long is 9223372036854775807
largest int is 2147483647long x=2147483648int y=-2147483648
Observe o sinal negativo y. Como xmantinha um valor maior que Integer.MAX_VALUE, int ynão foi possível mantê-lo. Nesse caso, ele volta para os números negativos.
Se você quiser lidar com esse caso, faça algo como:
if( x >(long)Integer.MAX_VALUE ){// x is too big to convert, throw an exception or something useful}else{
y =(int)x;}
Tudo isso assume números positivos. Para números negativos, use em MIN_VALUEvez de `MAX_VALUE '
Portanto, uma conversão adequada será detectar se a conversão é segura e lançar uma exceção caso contrário. Fato declarado por @Andrej Herich que sugeriu a biblioteca Guava.
raisercostin
55
Desde o Java 8, você pode usar: Math.toIntExact (valor longo)
@Grekz isso depende do OP. Eu faria neste caso. Mais jarros de dependência são melhores do que rodas reinventadas, a menos que você tenha um motivo real para não ter mais jarros de dependência.
precisa saber é o seguinte
1
IMHO, esta resposta é muito melhor do que a aceita, pois nunca faz algo inesperado.
Mark Slater
5
Desde o meu projeto já incluir esse jar, seria mais benéfico para usá-lo do que escrever um novo helper
Osify
24
long x =3;int y =(int) x;
mas isso pressupõe que o longpode ser representado como um int, você sabe a diferença entre os dois?
É interessante saber que, de acordo com o par 5.1.3 em java.sun.com/docs/books/jls/third_edition/html/… (a especificação da linguagem Java): Apesar do fato de que estouro, estouro ou outra perda de informação pode ocorrer, restringir conversões entre tipos primitivos nunca resulta em uma exceção em tempo de execução (§11).
extraneon
19
Você pode usar o Longwrapper em vez de longprimitivo e chamar
Pode ser uma boa idéia vincular à documentação atual, bem como expandir isso - inevitavelmente, haverá algum grau de arredondamento ao converter um tempo longo para um int.
Makoto
2
Olhando para a implementação do Long.intValue () em Java 7, está apenas lançando. Nenhuma verificação de sub / transbordamento é implementada. Portanto, pelo menos através do Java 7, essa opção é equivalente a apenas: (int) someLong.
buzz3791
por que menos votos positivos? Achei esta uma das respostas mais valiosas
Anand j. Kadhi
3
Se a transmissão direta mostrar erro, você poderá fazer o seguinte:
Em Java, long é um número assinado de 64 bits, o que significa que você pode armazenar números entre -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807 (inclusive).
Um int, por outro lado, é assinado com um número de 32 bits, o que significa que você pode armazenar um número entre -2.147.483.648 e 2.147.483.647 (inclusive).
Portanto, se o seu comprimento estiver fora dos valores permitidos para um int, você não receberá uma conversão valiosa.
Detalhes sobre tamanhos de tipos Java primitivos aqui:
A pergunta já estava respondida no momento em que a vi, mas o assunto dos limites da conversão não foi explicado. O que eu fiz então. Se você acha que é "bla bla bla", isso significa apenas que você é algum tipo de gênio que pode ficar sem esse tipo de coisa, mas para nós, meros seres humanos, uma explicação pode ser útil. Obrigado por sua "entrada" ...
Alexis Dufrenoy
1
No Java 8 eu faço da seguinte maneira
long l =100L;int i =Math.toIntExact(l);
Este método lança ArithmaticExceptionse o longvalor exceder o intervalo de int. Portanto, estou seguro de perda de dados.
Na primavera, existe uma maneira rigorosa de converter um tempo para int
não apenas o lnog pode converter em int, qualquer tipo de classe estende Number pode converter para outro tipo de Number em geral, aqui mostrarei como converter um comprimento em int, outro tipo vice-versa.
Long l =1234567L;int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l,Integer.class);
Respostas:
Atualizado, em Java 8:
Resposta original:
A conversão de tipo simples deve fazer isso:
Observe, no entanto, que números grandes (geralmente maiores que
2147483647
e menores que-2147483648
) perderão alguns bits e seriam representados incorretamente.Por exemplo,
2147483648
seria representado como-2147483648
.fonte
fonte
intValue()
faz aqui no fundo está lançando o valor .. Certo?long
aqui. É o tipo de referênciaLong
que não pode ser convertido diretamente em um primitivoint
.int y = (int)x;
lançará uma execução, masint y = (int)(long)x
funcionará. (A razão é autoboxing)Para valores pequenos, a conversão é suficiente:
No entanto, um
long
pode conter mais informações que umint
, portanto, não é possível converter perfeitamente delong
paraint
, no caso geral. Se olong
número tiver um número menor ou igual aInteger.MAX_VALUE
você, você poderá convertê-lo lançando sem perder nenhuma informação.Por exemplo, o seguinte código de exemplo:
produz a seguinte saída na minha máquina:
Observe o sinal negativo
y
. Comox
mantinha um valor maior que Integer.MAX_VALUE,int y
não foi possível mantê-lo. Nesse caso, ele volta para os números negativos.Se você quiser lidar com esse caso, faça algo como:
Tudo isso assume números positivos. Para números negativos, use em
MIN_VALUE
vez de `MAX_VALUE 'fonte
Desde o Java 8, você pode usar: Math.toIntExact (valor longo)
Consulte JavaDoc: Math.toIntExact
Código fonte de
Math.toIntExact
no JDK 8:fonte
Se estiver usando biblioteca de goiaba , existem métodos
Ints.checkedCast(long)
eInts.saturatedCast(long)
para converterlong
aint
.fonte
mas isso pressupõe que o
long
pode ser representado como umint
, você sabe a diferença entre os dois?fonte
Você pode usar o
Long
wrapper em vez delong
primitivo e chamarDocumentos Java7 intValue ()
Arredonda / trunca o
long
valor de acordo para caber em umint
.fonte
Se a transmissão direta mostrar erro, você poderá fazer o seguinte:
fonte
Em Java, long é um número assinado de 64 bits, o que significa que você pode armazenar números entre -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807 (inclusive).
Um int, por outro lado, é assinado com um número de 32 bits, o que significa que você pode armazenar um número entre -2.147.483.648 e 2.147.483.647 (inclusive).
Portanto, se o seu comprimento estiver fora dos valores permitidos para um int, você não receberá uma conversão valiosa.
Detalhes sobre tamanhos de tipos Java primitivos aqui:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
fonte
No Java 8 eu faço da seguinte maneira
Este método lança
ArithmaticException
se olong
valor exceder o intervalo deint
. Portanto, estou seguro de perda de dados.fonte
Se você deseja fazer uma conversão segura e aproveitar o uso do Java8 com expressão Lambda, use-o como:
fonte
Function<Long,Integer> function =
?x longo = 3120L; // aceita qualquer valor longo int z = x.intValue (); // você pode converter double em int também da mesma maneira
se você precisar se esconder diretamente,
longvalue.intvalue ();
fonte
fonte
Na primavera, existe uma maneira rigorosa de converter um tempo para int
não apenas o lnog pode converter em int, qualquer tipo de classe estende Number pode converter para outro tipo de Number em geral, aqui mostrarei como converter um comprimento em int, outro tipo vice-versa.
fonte