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.
int a='\15'
crée d'abord unchar
basé sur le nombre octal "15" (décimal 13, en tant que caractère, c'est l'ascii "Carriage Return"), que vous reconvertissez ensuite en unint
entier. 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.Réponses:
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"
) à uneint
variable. Java effectue un élargissement automatique de la conversion du 16 bits non signéchar
au 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
la source
1-3 digits
- ça aurait dû être0-3
. Et c'est pour l'octal à 3 chiffres, l'octal à deux chiffres peut encore avoir de0-7
. ex. «\ 77» est toujours valide.La notation
\nnn
désigne un code de caractère octal en Java.int a = '\15'
assigne donc la valeur auto-castée du caractère octal 15 àa
laquelle est le décimal 13.la source
\nnn
ne 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.)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.
la source