2009-04-20 22 views
74

Il apparaît que lorsque vous tapez un nombre en Java, le compilateur le lit automatiquement sous la forme d'un entier, ce qui explique pourquoi lorsque vous tapez 6000000000 (long), il se plaindre que 6000000000 n'est pas un nombre entier. Pour corriger cela, j'ai dû spécifier 6000000000L. Je viens d'apprendre à propos de cette spécification.La spécification du nombre L (long) de Java

Existe-t-il d'autres spécifications de nombre comme pour court, octet, flottant, double? Il semble que ce serait bon d'avoir parce que (je suppose) si vous pouviez spécifier le nombre que vous tapez est un court alors java n'aurait pas à le lancer - c'est une supposition, corrigez-moi si je me trompe . Normalement, je chercherais cette question moi-même, mais je ne sais pas ce que ce genre de spécification de numéro est même appelé.

Répondre

143

Il y a suffixes spécifiques pour long (par exemple 39832L), float (par exemple 2.4f) et double (par exemple -7.832d).

S'il n'y a pas de suffixe et qu'il s'agit d'un type intégral (par exemple 5623), il est supposé être int. Si ce n'est pas un type intégral (par exemple 3.14159), il est supposé être double.

Dans tous les autres cas (byte, short, char), vous avez besoin de la conversion car il n'y a pas de suffixe spécifique.

La spécification Java permet aux deux suffixes majuscules et minuscules, mais la version supérieure de cas pour long s est préféré, le cas supérieur L est moins facile à confondre avec un chiffre 1 que le minuscule l.

Voir le JLS section 3.10 pour les détails sanglants (voir la définition de IntegerTypeSuffix).

+7

entrée tardive: suppression de sources potentielles d'ambiguïté est toujours bon, et * Je ne suis pas en désaccord * ... mais je crois que si vous vous trouvez confus avec '1'' l' et '0' avec' O' (et ainsi de suite), votre * priorité * est de définir la police à droite (si vous le pouvez), puis vous soucier de vous assurer de ne pas manquer la touche Maj. – davidcesarino

+0

@SimonNickerson J'ai une question sur les suffixes ... Si je déclare une variable _long_ ou une variable _double_ comme: 'long _lo = 30;' et non '30L' cela signifie-t-il que ma variable sera convertie en _float_? Ou dans le cas de '_lo = _lo + 2.77' que' _lo' sera converti en _float_ bien qu'il ait été déclaré comme _long_ – luigi7up

+0

Non, les flottants ne sont pas impliqués ici. Dans le premier cas, '30' est un' int' qui est automatiquement converti via une conversion élargie en 'long'.Dans le second cas, votre déclaration est illégale. Vous devez explicitement lancer le côté droit à long, par ex. '_lo = (long) (_lo + 2.77)' –

0

Tenir compte:

long l = -1 >>> 1; 

contre

int a = -1; 
long l = a >>> 1; 

Maintenant que vous attendez la peine des fragments de code pour donner la même valeur à une variable l. Nous avons donc besoin d'expression sur int littéraux à faire comme int s.

8

Ce sont des littéraux et sont décrits dans section 3.10 de la spécification de langage Java.

12

J'espère que vous ne me dérangerait pas une légère tangente, mais que tu pourrais être intéressé de savoir qu'en plus F (pour float), D (pour le double) et L (pour longtemps), a proposal has been made ajouter suffixes pour byte et shortY et S respectivement. Cela éliminerait le besoin de convertir en octets lors de l'utilisation de la syntaxe littérale pour les tableaux byte (ou short). Citant l'exemple de la proposition:

avantage majeur: Pourquoi la plate-forme mieux si la proposition est adoptée?

Code cruddy comme

byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF}; 

peut être recodé comme

byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy }; 

Joe Darcy supervise Coin projet pour Java 7 et his blog a été un moyen facile de suivre ces propositions.

+0

ce serait bien ... J'ai toujours trouvé que tous les moulages sont vraiment ennuyeux – jbu

+0

Je le prends cela ne l'a pas fait en Java 7. Un mot sur s'il le fera dans une future mise à jour ou Java 8? – crush

+0

@crush J'ai essayé d'y jeter un œil il y a quelques mois, et pour autant que je sache, la proposition avait été abandonnée. Nous avons obtenu _ en littéraux numériques et le préfixe '0b' pour les littéraux binaires cependant. Cri. – erickson

1

Il semble que ce serait bon de ont parce que (je suppose) si vous pouvez indiquer le numéro que vous taper est un court alors java aurait pas à casting il

Comme l'analyse des littéraux se produit au moment de la compilation, cela n'a absolument aucune importance en termes de performances. La seule raison d'avoir des suffixes short et byte serait que cela conduise à un code plus compact.

3

Par défaut, tout type de données primitif intégral (octet, court, int, long) sera traité comme int par type par le compilateur java. Pour octet et court, tant que la valeur qui leur est attribuée est dans leur plage, il n'y a pas de problème et aucun suffixe requis. Si la valeur affectée à octet et court dépasse leur plage, la conversion de type explicite est requise.

Ex:

byte b = 130; // CE: range is exceeding. 

pour surmonter cette coulée de type effectuer.

byte b = (byte)130; //valid, but chances of losing data is there. 

En cas de type de données long, il peut accepter la valeur entière sans aucun tracas. Supposons que nous assignons comme

Long l = 2147483647; //which is max value of int 

dans ce cas, pas de suffixe comme L/l est nécessaire. Par défaut, la valeur 2147483647 est considérée par le compilateur Java comme un type int. La conversion de type interne est effectuée par le compilateur et int est promu automatiquement en type Long.

Long l = 2147483648; //CE: value is treated as int but out of range 

Ici, nous avons besoin de mettre le suffixe comme L pour traiter le 2147483648 littéral tant par le type compilateur java.

donc finalement

Long l = 2147483648L;// works fine.