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;
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
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!)int
)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.
Essayez de faire 9223372036854775807L
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;