Notez, cependant, qu'un grand nombre (généralement plus grand que 2147483647et plus petit que -2147483648) perdra certains des bits et serait représenté de manière incorrecte.
Par exemple, 2147483648serait représenté comme -2147483648.
@khachik Je pense que la précision est 1. Ou peut-être 42 bien sûr :)
extraneon
7
Le casting a différentes significations pour les objets et pour les types primitifs. (int) l n'essaie pas de traiter un entier 64 bits comme un entier 32 bits, il retourne en fait un entier différent 32 bits avec les mêmes 32 bits d'ordre inférieur. Avec les objets, vous effectuez un cast vers une classe enfant plus spécifique, mais avec les types primitve, un cast n'est pas vraiment un cast, mais une conversion.
dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Si une conversion ne détecte pas dans ce cas que x a une valeur incorrecte, alors vous n'avez pas de solution.
raisercostin
Math.toIntExact () est en fait une excellente méthode. Il lève et exception si la valeur est trop grande pour tenir dans un int. Merci pour la suggestion.
Quelle est la différence entre cette façon de faire et simplement la valeur ajoutée? Je pense que tout ce qui intValue()est ici en arrière-plan, c'est de donner de la valeur.
Tim Wißmann
1
Notez les types. Ce n'est pas une primitive longici. C'est le type de référence Longqui ne peut pas directement être converti en primitive int. int y = (int)x;lance une exception mais int y = (int)(long)xfonctionne. (La raison est la boxe automatique)
akop
58
Pour les petites valeurs, le casting suffit:
long l =42;int i =(int) l;
Cependant, un longpeut contenir plus d'informations qu'un int, il n'est donc pas possible de convertir parfaitement de longà int, dans le cas général. Si le longnombre contient un nombre inférieur ou égal à Integer.MAX_VALUEvous pouvez le convertir en lançant sans perdre aucune information.
Par exemple, l'exemple de code suivant:
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);
produit la sortie suivante sur ma machine:
largest long is 9223372036854775807
largest int is 2147483647long x=2147483648int y=-2147483648
Remarquez le signe négatif y. Parce que xdétenait une valeur supérieure à Integer.MAX_VALUE, int yn'a pas pu la conserver. Dans ce cas, il s'est enroulé autour des nombres négatifs.
Si vous vouliez gérer ce cas vous-même, vous pourriez faire quelque chose comme:
if( x >(long)Integer.MAX_VALUE ){// x is too big to convert, throw an exception or something useful}else{
y =(int)x;}
Tout cela suppose des chiffres positifs. Pour les nombres négatifs, utilisez MIN_VALUEau lieu de «MAX_VALUE»
Ainsi, une conversion appropriée consistera à détecter si la conversion est sûre et à lever une exception dans le cas contraire. Fait déclaré par @Andrej Herich qui a suggéré la bibliothèque de goyave.
raisercostin
55
Depuis Java 8, vous pouvez utiliser: Math.toIntExact (valeur longue)
Il n'est pas nécessaire d'utiliser des bibliothèques
Grekz
6
@Grekz c'est à l'OP. Je le ferais dans ce cas. Plus de pots de dépendance est mieux que plus de roues réinventées, sauf si vous avez une raison réelle de ne pas avoir plus de pots de dépendance.
djechlin
1
À mon humble avis, cette réponse est bien meilleure que celle acceptée, en ce qu'elle ne fait jamais quelque chose d'inattendu.
Mark Slater
5
Étant donné que mon projet inclut déjà ce pot, il serait plus avantageux de l'utiliser que d'écrire un nouvel assistant
Osify
24
long x =3;int y =(int) x;
mais cela suppose que le longpeut être représenté comme un int, vous connaissez la différence entre les deux?
Il est intéressant de savoir que, conformément au paragraphe 5.1.3 de java.sun.com/docs/books/jls/third_edition/html/… (The Java Language Spec): Malgré le fait que le débordement, le sous-débit ou toute autre perte d'informations peut se produisent, le rétrécissement des conversions entre les types primitifs n'entraîne jamais d'exception d'exécution (§11).
extraneon
19
Vous pouvez utiliser le Longwrapper au lieu de la longprimitive et appeler
Il peut être judicieux de créer un lien vers la documentation actuelle, ainsi que de l'étendre - inévitablement, il y aura un certain degré d'arrondi lors de la conversion d'un long en un entier.
Makoto
2
En regardant l'implémentation Java 7 de Long.intValue (), c'est juste du casting. Aucune vérification de sous / dépassement n'est implémentée. Donc, au moins via Java 7, cette option équivaut à simplement: (int) someLong.
buzz3791
pourquoi moins de votes positifs? J'ai trouvé celle-ci de la réponse la plus précieuse
Anand j. Kadhi
3
Si la diffusion directe montre une erreur, vous pouvez le faire comme ceci:
En Java, un long est un nombre signé de 64 bits, ce qui signifie que vous pouvez stocker des nombres compris entre -9 223 372 036 854 775 808 et 9 223 372 036 854 775 807 (inclus).
Un int, d'autre part, est un nombre signé de 32 bits, ce qui signifie que vous pouvez stocker un nombre compris entre -2 147 483 648 et 2 147 483 647 (inclus).
Donc, si votre long est en dehors des valeurs autorisées pour un int, vous n'obtiendrez pas une conversion valable.
Détails sur les tailles des types Java primitifs ici:
La question était déjà répondue au moment où je l'ai vue, mais le sujet des limites de la conversion n'était pas expliqué. Ce que je fis alors. Si vous pensez que c'est "bla bla bla", cela signifie seulement que vous êtes une sorte de génie qui peut se passer de ce genre de chose, mais pour nous, simples humains, une explication peut être utile. Merci pour votre "entrée" ...
Alexis Dufrenoy
1
En Java 8, je fais de la manière suivante
long l =100L;int i =Math.toIntExact(l);
Cette méthode lance ArithmaticExceptionsi la longvaleur dépasse la plage de int. Ainsi je suis à l'abri de la perte de données.
Au printemps, il existe un moyen rigoureux de convertir un long en int
non seulement lnog peut se convertir en int, tout type de classe étend Number peut être converti en un autre type Number en général, ici je vais vous montrer comment convertir un long en int, un autre type vice versa.
Long l =1234567L;int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l,Integer.class);
Réponses:
Mise à jour, en Java 8:
Réponse originale:
Le casting de type simple devrait le faire:
Notez, cependant, qu'un grand nombre (généralement plus grand que
2147483647
et plus petit que-2147483648
) perdra certains des bits et serait représenté de manière incorrecte.Par exemple,
2147483648
serait représenté comme-2147483648
.la source
la source
intValue()
est ici en arrière-plan, c'est de donner de la valeur.long
ici. C'est le type de référenceLong
qui ne peut pas directement être converti en primitiveint
.int y = (int)x;
lance une exception maisint y = (int)(long)x
fonctionne. (La raison est la boxe automatique)Pour les petites valeurs, le casting suffit:
Cependant, un
long
peut contenir plus d'informations qu'unint
, il n'est donc pas possible de convertir parfaitement delong
àint
, dans le cas général. Si lelong
nombre contient un nombre inférieur ou égal àInteger.MAX_VALUE
vous pouvez le convertir en lançant sans perdre aucune information.Par exemple, l'exemple de code suivant:
produit la sortie suivante sur ma machine:
Remarquez le signe négatif
y
. Parce quex
détenait une valeur supérieure à Integer.MAX_VALUE,int y
n'a pas pu la conserver. Dans ce cas, il s'est enroulé autour des nombres négatifs.Si vous vouliez gérer ce cas vous-même, vous pourriez faire quelque chose comme:
Tout cela suppose des chiffres positifs. Pour les nombres négatifs, utilisez
MIN_VALUE
au lieu de «MAX_VALUE»la source
Depuis Java 8, vous pouvez utiliser: Math.toIntExact (valeur longue)
Voir JavaDoc: Math.toIntExact
Code source de
Math.toIntExact
JDK 8:la source
Si vous utilisez la bibliothèque Guava , il existe des méthodes
Ints.checkedCast(long)
etInts.saturatedCast(long)
pour convertirlong
enint
.la source
mais cela suppose que le
long
peut être représenté comme unint
, vous connaissez la différence entre les deux?la source
Vous pouvez utiliser le
Long
wrapper au lieu de lalong
primitive et appelerDocuments JavaV intValue ()
Il arrondit / tronque la
long
valeur en conséquence pour tenir dans unint
.la source
Si la diffusion directe montre une erreur, vous pouvez le faire comme ceci:
la source
En Java, un long est un nombre signé de 64 bits, ce qui signifie que vous pouvez stocker des nombres compris entre -9 223 372 036 854 775 808 et 9 223 372 036 854 775 807 (inclus).
Un int, d'autre part, est un nombre signé de 32 bits, ce qui signifie que vous pouvez stocker un nombre compris entre -2 147 483 648 et 2 147 483 647 (inclus).
Donc, si votre long est en dehors des valeurs autorisées pour un int, vous n'obtiendrez pas une conversion valable.
Détails sur les tailles des types Java primitifs ici:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
la source
En Java 8, je fais de la manière suivante
Cette méthode lance
ArithmaticException
si lalong
valeur dépasse la plage deint
. Ainsi je suis à l'abri de la perte de données.la source
Si vous souhaitez effectuer une conversion sûre et profiter de l'utilisation de Java8 avec l'expression Lambda, vous pouvez l'utiliser comme:
la source
Function<Long,Integer> function =
?long x = 3120L; // prend n'importe quelle valeur longue int z = x.intValue (); // vous pouvez également convertir double en int de la même manière
si vous avez besoin de cacher directement alors
longvalue.intvalue ();
la source
la source
Au printemps, il existe un moyen rigoureux de convertir un long en int
non seulement lnog peut se convertir en int, tout type de classe étend Number peut être converti en un autre type Number en général, ici je vais vous montrer comment convertir un long en int, un autre type vice versa.
la source