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 775 808 et +9 223 372 036 854 775 807. Maintenant, comme vous pouvez le voir ci-dessous, j'ai créé une long
variable appeléetestLong
, bien que lorsque j'insère 9223372036854775807 comme valeur, j'obtiens une erreur indiquant:
Le littéral 9223372036854775807 du type int est hors limites.
Je ne sais pas pourquoi il fait référence au long
type de données en tant que fichier int
.
Quelqu'un a des idées?
Code:
char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;
java
int
long-integer
Mathew Donnan
la source
la source
Réponses:
Ajoutez une majuscule
L
à la fin:Sinon, le compilateur essaiera d'analyser le littéral comme un
int
, d'où le message d'erreurla source
8
ou9
. Supprimez les zéros de tête.Ce n'est pas. Vous devez apprendre à faire confiance aux messages du compilateur (surtout lorsqu'ils proviennent de compilateurs sains et modernes et non d'anciens compilateurs C / C ++). Bien que la langue qu'ils parlent soit parfois difficile à déchiffrer, ils ne vous mentent généralement pas.
Regardons à nouveau:
Notez qu'il ne mentionne nulle part votre variable
testLong
ou le typelong
, donc ce n'est pas de l'initialisation. Le problème semble survenir à un autre moment.Examinons maintenant certaines parties du message:
int
nous dit qu'il veut traiter quelque chose comme unint
valeur (ce qui n'est pas ce que vous vouliez!)int
)Je vais laisser la liste confortable pour parler des littéraux pendant un moment: les littéraux sont des endroits où vous avez une certaine valeur dans votre code. Il y a des
String
littéraux, desint
littéraux, desclass
littéraux, etc. Chaque fois que vous mentionnez une valeur explicitement dans votre code, c'est un littéral.Donc, ce n'est pas vraiment vous harceler à propos de la déclaration de variable, mais le nombre lui-même, la valeur est ce qui vous harcèle.
Vous pouvez facilement le vérifier en utilisant le même littéral dans un contexte où a
long
et anint
sont également acceptables:PrintStream.println
peut prendre unint
ou unlong
(ou à peu près n'importe quoi d'autre). Donc, ce code devrait être correct, non?Non. Peut-être que ça devrait l' être, mais selon les règles, ce n'est pas bien.
Le problème est que "certains chiffres" est défini comme un
int
littéral et doit donc être dans la plage définie parint
.Si vous voulez écrire un
long
littéral, vous devez le rendre explicite en ajoutantL
(ou en minusculesl
, mais je vous suggère fortement d' utiliser toujours la variante majuscule, car c'est beaucoup plus facile à lire et plus difficile à confondre avec a1
).Notez qu'un problème similaire se produit avec
float
(postfixF
/f
) etdouble
(postfixD
/d
).Note latérale: vous vous rendrez compte qu'il n'y a pas de
byte
oushort
littéraux et que vous pouvez toujours attribuer des valeurs (généralement desint
littéraux) àbyte
et desshort
variables: c'est possible grâce aux règles spéciales du § 5.2 sur Assignment Converson : elles permettent l'affectation d'expressions constantes d'un type plus grand àbyte
,short
,char
ouint
si les valeurs se situent dans les types varient.la source
Essayez de faire
9223372036854775807L
. LeL
à la fin indique à Java qu'il9223372036854775807
s'agit d'un fichierlong
.la source
J'ai eu ce problème dans le passé et je l'ai résolu en écrivant la valeur sous forme scientifique. par exemple:
la source
Les deux utilisent mais à la fois un seul utilise L majuscule ou l minuscule.
Pourquoi utiliser L / l? Parce que long fait partie du type de données intégral.
la source