Quelle est la sémantique Java d'un nombre échappé dans un littéral de caractère, par exemple '\ 15'?

85

Veuillez expliquer ce qui se passe exactement lorsque les sections de code suivantes sont exécutées:

int a='\15';
System.out.println(a);

ceci imprime 13;

int a='\25';
System.out.println(a);

ceci imprime 21;

int a='\100';
System.out.println(a);

cela imprime 64.

VAr
la source
22
On dirait qu'il interprète le nombre comme un octal.
Nikhil
5
int a='\15'crée d'abord un charbasé sur le nombre octal "15" (décimal 13, en tant que caractère, c'est l'ascii "Carriage Return"), que vous reconvertissez ensuite en un intentier. Ceci est légal puisque les caractères sont des entiers de 16 bits, c'est donc un upcast sûr et aucun avis sur la diffusion n'est émis par Java. Les autres réponses couvrent déjà tout le truc octal / décimal.
Mike 'Pomax' Kamermans

Réponses:

116

Vous avez assigné un littéral de caractère, qui est délimité par des guillemets simples, par exemple 'a'(comme distinct d'un littéral de chaîne, qui est délimité par des guillemets doubles, par exemple "a") à une intvariable. Java effectue un élargissement automatique de la conversion du 16 bits non signé charau 32 bits signé int.

Cependant, lorsqu'un littéral de caractère est une barre oblique inverse suivie de 1 à 3 chiffres, il s'agit d'une représentation octale ( base / base 8) du caractère. Donc:

  • \15= 1 × 8 + 5 = 13 (un retour chariot; identique à '\r')
  • \25 = 2 × 8 + 5 = 21 (un caractère NAK - accusé de réception négatif)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (le symbole @; identique à '@')

Pour plus d'informations sur les littéraux de caractères et les séquences d'échappement, consultez les sections JLS:

Citant le BNF du 3.10.6:

OctalEscape:
    \ OctalDigit
    \ OctalDigit OctalDigit
    \ ZeroToThree OctalDigit OctalDigit

OctalDigit: one of
    0 1 2 3 4 5 6 7

ZeroToThree: one of
    0 1 2 3
Bohème
la source
3
Je ne le trouve pas dans la section 3.10.1 .. C'est dans la 3.10.4, Character Literals
Rafi Kamal
1
La section sur les littéraux entiers n'est pas pertinente. Voir la section 3.10.4 . Voir également la section 3.10.6 pour les séquences d'échappement de caractères et de chaînes.
Ted Hopp
1-3 digits- ça aurait dû être 0-3. Et c'est pour l'octal à 3 chiffres, l'octal à deux chiffres peut encore avoir de 0-7. ex. «\ 77» est toujours valide.
Jayamohan
6
@Jayamohan Je voulais dire 1-3 en quantité, pas en valeur
Bohème
@Bohémien. Bonne réponse. Je vous suggère d'ajouter la syntaxe du littéral d'échappement octal ici, donc ce sera plus clair. :)
Rohit Jain
19

La notation \nnndésigne un code de caractère octal en Java. int a = '\15'assigne donc la valeur auto-castée du caractère octal 15 à alaquelle est le décimal 13.

Bahman Movaqar
la source
5
La notation \nnnne désigne pas un nombre octal en Java. Dans le code d'OP, il désigne une séquence d'échappement de caractères octaux. Les guillemets environnants sont essentiels. Le caractère est ensuite élargi à une valeur entière par l'affectation. (Les nombres octaux sont indiqués par un chiffre zéro non significatif.)
Ted Hopp
Bon point; aurait dû mentionner l'auto-cast dans la réponse. Mise à jour de la réponse.
Bahman Movaqar
6

Le fait que vous mettiez les chiffres entre guillemets me fait soupçonner qu'il interprète le nombre comme un littéral de caractère. Les chiffres qui suivent doivent être en octal.

Nikhil
la source