En Java, est le résultat de l'addition de deux caractères d'un int ou un char?
Lors de l'ajout d' 'a' + 'b'
il produit 195. Est la sortie type de données char
ou int
?
- Si le type de
char
alors la valeur de'a' + 'b'
ne serait pas195
mais'Ã'
- Il est de 195 sur ici - ideone.com mais pas dans Eclipse.
- Vous avez bien lu des Algorithmes livre lol! Je suis venu ici à cause de cet exercice exactement 😉
Vous devez vous connecter pour publier un commentaire.
Le résultat de l'ajout de Java chars, des shorts ou des octets est un int:
Java Langage de Spécification sur les Binaires Numériques de Promotion de la:
Mais notez ce qu'il dit à propos de composé des opérateurs d'affectation (comme +=):
Par exemple:
Une façon, vous pouvez trouver le type de résultat, en général, est de lancer à un Objet et de lui demander dans quelle classe il est:
Si vous êtes intéressé par la performance, la note que la Le bytecode Java n'ont même pas dédié instructions pour l'arithmétique avec les plus petits types de données. Par exemple, pour ajouter, il y a des instructions
iadd
(pour les entiers),ladd
(pour les longs),fadd
(pour les chars),dadd
(pour les doubles), et c'est tout. Pour simulerx += y
avec les plus petits types, le compilateur utiliseraiadd
, puis zéro la partie supérieure octets de l'int à l'aide de l'instructioni2c
("int en char"). Si le natif du PROCESSEUR a consacré instructions pour 1 octet ou de données de 2 octets, c'est à la machine virtuelle Java pour optimiser pour qu'au moment de l'exécution.Si vous voulez concaténer des caractères d'une Chaîne plutôt que de les interpréter comme un type numérique, il y a beaucoup de façons de le faire. Le plus simple est d'ajouter une Chaîne vide à l'expression, car l'ajout d'un char et d'une Chaîne de résultats dans une Chaîne de caractères. Toutes ces expressions résultat dans la Chaîne
"ab"
:'a' + "" + 'b'
"" + 'a' + 'b'
(ceci fonctionne parce que"" + 'a'
est évalué en premier; si le""
étaient à la fin au lieu de cela, vous obtenez"195"
)new String(new char[] { 'a', 'b' })
new StringBuilder().append('a').append('b').toString()
String.format("%c%c", 'a', 'b')
Binaire des opérations arithmétiques sur
char
etbyte
(etshort
) de promouvoir desint
-- JLS 5.6.2.Vous pouvez apprendre les expressions suivantes à propos de
char
.Ce qui est parfaitement valide en Java et retourne
66
, la valeur correspondante de l'caractères (Unicode) dec+1
.C'est aussi valable en Java et le type de Chaîne variable
temp
accepte automatiquementc
de type char et produittemp=A
sur la console.Toutes les affirmations suivantes sont également valables en Java!
Bien que
c
est un type dechar
, elle peut être fournie avec aucune erreur dans les différents constructeurs et toutes les déclarations ci-dessus sont traités comme des instructions valides. Ils produisent les résultats suivants, respectivement.char
est une primitive intégrale de type et, comme telle, est soumis à toutes les règles de ces bêtes dont la conversion et les promotions. Vous aurez envie de lire sur ce, et le JLS est l'une des meilleures sources pour cette: Les Conversions et les Promotions. En particulier, lire le peu court sur "5.1.2 l'Élargissement des Primitives de Conversion".Le compilateur Java peut l'interpréter comme l'un des deux.
Vérifier par l'écriture d'un programme et la recherche d'erreurs du compilateur:
Si c'est un char, puis la première ligne va me donner l'erreur et le second ne le sera pas.
Si c'est un int, alors le contraire qui se produira.
J'ai compilé et j'ai eu..... PAS D'ERREURS. Donc Java accepte à la fois.
Cependant, quand je l'ai imprimé, je l'ai eu:
Ce qui se passe est que lorsque vous faites:
une conversion implicite est faite (un "primitif conversion restrictive" de l' int à char).
Selon la binaire règles de la promotion, si aucun des deux opérandes est double, float ou long, les deux sont promus en int. Cependant, je conseille fortement contre le traitement de char de type numérique, ce genre de défaites le but.
char
comme une valeur numérique est entièrement à l'intérieur de son but, qui est pourquoi les JLS consacre donc beaucoup de verbiage pour une telle utilisation.Pendant que vous avez la bonne réponse déjà (référencé dans le JLS), voici un peu de code pour vérifier que vous obtenez une
int
lors de l'ajout de deuxchar
s.La sortie est
char
est représenté commeUnicode
valeurs et où les valeurs Unicode sont représentés par\u
suivie parHexadécimal
valeurs.Comme toute opération arithmétique sur
char
valeurs promues àint
, de sorte que le résultat de'a' + 'b'
est calculé comme1.) Appliquer le
Unicode
valeurs correspondantchar
à l'aide deTableau Unicode
2.) Appliquer le Hexadécimal vers Décimal de conversion, puis effectuer l'opération sur
Decimal
valeurs.Unicode Pour Convertisseur Décimal
Exemple
Donc
97 + 98 = 195
Exemple 2
Voici quelque chose d'étrange, si. Le suivant compile:
Mais ce n'est pas:
Il semblerait que les deux expressions ('a'+'b' x+b') suite de nombres entiers, par le test suivant:
Alors pourquoi le second cas compile pas? D'ailleurs, vous pouvez le fixer par la coulée de l'ensemble de l'expression comme un char:
Ce qui semble être une incohérence dans la sémantique de Java - char expression doit être interchangeable avec un autre dans n'importe quel contexte. Personne ne sait d'une façon de donner un sens à cela?