web-dev-qa-db-fra.com

Le xyz littéral de type int est hors de portée

Je travaille actuellement avec les types de données en Java et, si j’ai bien compris, le type long accepte une valeur comprise entre les plages suivantes: -9 223 372 036 854 à + 9 223 372 036 854 755 807. Maintenant, comme vous pouvez le voir ci-dessous, j'ai créé une variable Longue appelée testLong, bien que lorsque j'insère 9223372036854775807 en tant que valeur, j'obtiens une erreur indiquant:

"Le littéral 9223372036854775807 du type int est hors de portée."

Je ne sais pas pourquoi il fait référence au type de données long en tant que int

Quelqu'un a des idées?

Code ci-dessous:

char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;
77
Mathew Donnan

Ajouter une majuscule L à la fin:

long value = 9223372036854775807L;

Sinon, le compilateur essaiera d'analyser le littéral en tant que int, d'où le message d'erreur

176
Lukas Eder

Je ne sais pas pourquoi il fait référence au type de données long en tant qu'int

Ce n'est pas. Vous devriez apprendre à faire confiance aux messages du compilateur (en particulier lorsqu'ils proviennent de compilateurs sains et modernes et non d'anciens compilateurs C/C++). Bien que la langue qu'ils parlent puisse être parfois difficile à déchiffrer, ils ne vous mentent généralement pas.

Regardons à nouveau:

Le littéral de 9223372036854775807 est hors limites.

Notez que ne mentionne pas votre variable testLong ou le type long, elle est donc pas à propos de l'initialisation. Le problème semble se produire à un autre moment.

Examinons maintenant certaines parties du message:

  • int nous dit qu'il veut traiter quelque chose comme une valeur int (qui n'est pas ce que vous vouliez!)
  • "out of range" est assez clair: quelque chose ne se trouve pas dans la plage attendue (probablement celle de int)
  • "Le littéral": voilà qui est intéressant: qu'est-ce qu'un littéral?

Je vais laisser la liste confortable pour parler un instant des littéraux: les littéraux sont des endroits où vous avez une certaine valeur dans votre code. Il y a String littéraux, int littéraux, class littéraux, etc. Chaque fois que vous mentionnez explicitement une valeur dans votre code, il s'agit d'un littéral.

Ainsi, la déclaration de variable ne vous dérange pas, mais le nombre lui-même, la valeur est ce qui vous préoccupe.

Vous pouvez facilement le vérifier en utilisant le même littéral dans un contexte où un long et un int sont également acceptables:

System.out.println(9223372036854775807);

PrintStream.println peut prendre soit n int ou n long (ou à peu près tout le reste). Donc, ce code devrait être bon, non?

Non. Eh bien, peut-être que devrait être, mais selon les règles, il est pas très bien.

Le problème est que "quelques chiffres" est défini comme un int littéral et donc doit être dans le plage définie par int.

Si vous voulez écrire un littéral long, vous devez le rendre explicite en ajoutant le L (ou minuscule l, mais I fortement suggère de toujours utiliser la variante en majuscule, car il est beaucoup plus facile à lire et plus difficile à confondre pour un 1).

Notez qu'un problème similaire se produit avec float (postfix F/f) et double (postfix D/d).

Note latérale: vous vous rendrez compte qu'il n'y a pas de littéraux byte ou short et que vous pouvez toujours affecter des valeurs (généralement int littéraux) à byte et short variables: cela est possible grâce à des règles spéciales dans § 5.2 à propos de Conversation d'affectation : elles permettent d'affecter des expressions constantes d'un type plus grand à byte, short, char ou int si les valeurs sont comprises dans la plage de types.

45
Joachim Sauer

Essayez de faire 9223372036854775807L

11
jontro

J'ai eu ce problème dans le passé et je l'ai corrigé en écrivant la valeur dans la forme scientifique . Par exemple:

double val = 9e300;
0
user7507137