Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Java Quiz #3

Déterminez le résultat de :

  1. short s = 127;
  2. s = s+1;
  3. 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 ?

  1. short s = 127;
  2. s += 1;
  3. 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 à :

  1. short s = 127;
  2. s = (short) (s+1);
  3. 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

1. Le vendredi 7 mars 2008, 14:52 par Olivier

Merci à Olivier Descout pour ses corrections :)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.