mar.
2008
Java Quiz #3
Déterminez le résultat de :
short s = 127; s = s+1; System.out.println(s);
Réponse : ce code ne compile pas.
Et non, ce n'est pas à cause de la valeur du short : un short est un entier signé sur 16bits, et permet donc de compter de -32768 à +32767. Mais 127 fait effectivement partie des valeurs suspectes en l'informatique, ça ressemble fort à une valeur limite... pour les bytes qui sont codés sur 8bits signés.
Le réel problème ici vient de la façon dont Java réalise les calculs sur les entiers :
- les valeurs littérales numériques entières (comme le "1" du quizz) sont considérées comme des int
- les opérations arithmétiques sont toujours réalisées sur des opérandes de même taille, et au minimum sur des int ; si nécessaire, l'opérande de plus petite taille est donc "élargi" ("widened"). Le résultat de l'opération est alors du même type que les opérandes.
Revenons à notre exemple.
- Dans l'expression "s + 1", "1" étant un int, le short "s" est automatiquement transformé en int pour le calcul.
- Le résultat, 128, est donc de type int également.
- Problème : on ne peut pas affecter un int à la référence "s" de type short à cause de la perte possible de précision. Le compilateur détecte ce problème et signale une erreur.
Maintenant, petit exercice pratique : que fait le code suivant ?
short s = 127; s += 1; System.out.println(s);
Réponse : celui-ci compile correctement.
Il faut savoir que le compilateur traite les opérateurs composites (+= , -= , /= , etc.) différemment des opérateurs normaux : un "cast" est automatiquement appliqué au membre droit de l'affectation, donc au résultat de notre opération. Le code ci-dessus est donc équivalent à :
short s = 127; s = (short) (s+1); System.out.println(s);
Conclusion : inutile d'essayer de gagner de la place en mémoire en utilisant des types primitifs de petite taille lors des calculs, puisqu'ils seront transformés en int...
Commentaires
Merci à Olivier Descout pour ses corrections :)