java Entier.MAX_VALUE, MIN_VALUE débordement
Ok peut-être que je suis juste fatigué à cause de cela, mais comment puis-je y arriver?
int x = Integer.MAX_VALUE+10;
//ou peut-être
int x = Integer.MIN_VALUE-20;
Je veux juste si l'instruction pour les attraper si x est "dans la marge" un peu comme ceci:
if(x >= Intefer.MAX_VALUE || x <= Integer.MIN_VALUE){ //throw exception}
Mais le problème est que si la valeur est, comme mentionné ci-dessus, comme MAX_VALUE + 10, la valeur finit par être ni supérieur à la VALEUR MAX, ni inférieure à la MIN_VALUE et si les conditions ne sont pas remplies...
Edit: Pour clarifier ce que je voulais dire:
Je ne veux pas en réalité de stocker toutes les valeurs plus grandes que la valeur max/min.
Imaginez ceci:
Un champ, vous écrivez 10+10 et il dit "Ok, c'est 20"
Ensuite, quelqu'un peut-être écrira 1000000*100000 et il va répondre à votre réponse, ainsi
mais alors quelqu'un pourrait écrire quelque chose qui dépasse les valeurs max/min comme, 10000000*1000000*1000000 ou someyhing comme ça et puis le programme devrait être quelque chose comme "Hold up, c'est beaucoup trop haut! voici un "0" pour vous à la place"
OriginalL'auteur Deragon | 2012-09-08
Vous devez vous connecter pour publier un commentaire.
Cela peut être résolu en 2 façons:
Première façon:
if(x + 10 <= x){ //Has wrapped arround so throw exception}
Deuxième moyen (mieux):
long x = Integer.MAX_VALUE+10L;
Maintenant, le conditionnel fonctionne correctement
if(x >= Integer.MAX_VALUE){ //throw exception}
long x = Integer.MAX_VALUE+10;
déborde trop, car l'addition est effectuée au typeint
. Utilisation10L
ou d'un plâtre pour avoir le plus fait à typelong
.catch!Mise à jour de réponse
OriginalL'auteur Cratylus
Si vous avez besoin de représenter des nombres entiers qui sont plus grands ou plus petits que les limites, puis utilisez
long
au lieu deint
variables. Si, d'autre part, vous êtes vraiment se soucier deint
les variables qui contiennent une valeur plus grande queInteger.MAX_VALUE
, alors arrêtez de vous inquiéter -- une telle chose ne peut pas exister. Par le temps, la valeur est stockée dans unint
, tout dépassement supérieur ou inférieur a déjà eu lieu.OriginalL'auteur Ernest Friedman-Hill
Le problème avec toutes les déjà apporté des solutions, c'est qu'ils tous recommandent upcasting primitive qui est d'une taille de plus pour effectuer votre calcul (comme l'utilisation de
long
au lieu deint
).Cette approche est un peu la main lourde et échoue lorsque vous utilisez déjà la plus primitive. Au lieu de cela, vous pouvez vérifier pour voir si une opération, telles que l'addition ou la soustraction, un débordement avant d'effectuer l'opération.
Voici une fonction de Le CERT Oracle Secure Coding Standard de Java, qui offre également des fonctions équivalentes pour les autres opérateurs mathématiques, telles que la soustraction.
OriginalL'auteur AffluentOwl
Integer.MAX_VALUE
etMIN_VALUE
sont la plus grande/plus petite des valeurs représentable avec unint
. C'est le point: vous ne peut pas ont unint
avec plus ou moins importante des valeurs.Si vous voulez garder et d'essai contre plus ou moins grande des valeurs, vous aurez besoin d'utiliser un
long
.Lorsque vous essayez d'ajouter, par exemple
Integer.MAX_VALUE
et maintenez le résultat dans unint
, la variable débordement, et le résultat restera une valeur quelque part entreMAX_VALUE
etMIN_VALUE
.OriginalL'auteur pb2q