Le xyz littéral de type int est hors de scope

Je travaille actuellement avec des types de données en Java, et si j’ai bien compris, le type long accepte une valeur comprise entre -9,223,372,036,854 et +9,223,372,036,854,775,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 comme valeur, je reçois une erreur indiquant:

“Le littéral 9223372036854775807 du type int est hors limites.”

Je ne sais pas pourquoi il se réfère au type de données long comme un 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; 

Ajoutez un L majuscule à la fin:

 long value = 9223372036854775807L; 

Sinon, le compilateur essaiera d’parsingr le littéral sous la forme d’un int , d’où le message d’erreur

Je ne sais pas pourquoi il se réfère au type de données long comme un 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 le langage qu’ils parlent puisse parfois être difficile à déchiffrer, ils ne vous mentent généralement pas.

Regardons ça encore:

Le littéral de l’int 9223372036854775807 est hors de scope.

Notez qu’il ne mentionne pas votre variable testLong ou le type long n’importe où, il ne s’agit donc pas de l’initialisation. Le problème semble se produire à un autre moment.

Maintenant, examinons certaines parties du message:

  • int nous dit qu’il veut traiter quelque chose comme une valeur int (ce 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”: c’est intéressant: qu’est-ce qu’un littéral?

Je vais laisser la liste intime pour parler des littéraux pendant un moment: les littéraux sont des endroits où vous avez de la valeur dans votre code. Il y a des littéraux de Ssortingng littéraux int , class littéraux de class , etc. Chaque fois que vous mentionnez une valeur explicitement dans votre code, c’est un littéral.

Donc, la déclaration de variables ne vous harcèle pas, mais le nombre lui-même, la valeur qui vous préoccupe.

Vous pouvez facilement vérifier cela 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 un int ou un long (ou à peu près tout le rest). Donc, ce code devrait être correct, non?

Non. Eh bien, peut-être que ça devrait l’ être, mais selon les règles, ça ne va pas.

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

Si vous voulez écrire un littéral long , vous devez le rendre explicite en ajoutant le L (ou minuscule, mais je suggère fortement que vous utilisez toujours la variante majuscule, car il est beaucoup plus facile à lire et plus difficile à confondre avec 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éral short ou en byte et que vous pouvez toujours atsortingbuer des valeurs (généralement des littéraux int ) à des byte et short variables short : ceci est possible grâce aux règles spéciales du § 5.2 expressions de type plus grand pour byte , short , char ou int si les valeurs sont comsockets dans la plage des types.

Essayez de faire 9223372036854775807L

J’ai eu ce problème dans le passé et j’ai corrigé cela en écrivant la valeur dans la forme scientifique. par exemple:

 double val = 9e300; 
 long ak = 34778754226788444L/l; 

Les deux utilisent mais à la fois un seul utilise L majuscule ou minuscule l.

Pourquoi utiliser L / l? Parce que long fait partie du type de données intégral.