Vérifier un entier par rapport aux limites du type short
Dans l'étape précédente, nous avons vu comment déclarer et utiliser des variables de type short
dans leur plage valide. Maintenant, explorons ce qui se passe lorsque nous essayons d'assigner une valeur en dehors de la plage du type short
à une variable de ce type.
Java dispose de différents types de données entières, notamment byte
, short
, int
et long
, chacun ayant une plage différente. Un int
(entier) est un entier signé sur 32 bits en complément à deux, avec une plage allant de -2 147 483 648 à 2 147 483 647. Cette plage est beaucoup plus large que celle d'un short
.
Lorsque vous essayez d'assigner une valeur d'un type de données plus large (comme int
) à un type de données plus petit (comme short
), Java vous oblige à lui indiquer explicitement que vous êtes conscient du risque de perte d'informations. Cela s'appelle le transtypage (type casting). Si vous ne faites pas de transtypage, Java vous donnera une erreur de compilation pour éviter une perte de données accidentelle.
Modifions notre programme HelloJava.java
pour illustrer cela.
-
Ouvrez le fichier HelloJava.java
dans l'éditeur WebIDE.
-
Remplacez le code existant par le suivant :
public class HelloJava {
public static void main(String[] args) {
int largeInt = 40000; // This value is outside the short range
// Attempt to assign largeInt to a short variable without casting
// short myShort = largeInt; // This line will cause a compilation error
// To assign a value from a larger type, we need to cast it
short myShort = (short) largeInt;
System.out.println("Value of largeInt cast to short: " + myShort);
int anotherLargeInt = -40000; // Another value outside the short range
short anotherShort = (short) anotherLargeInt;
System.out.println("Value of anotherLargeInt cast to short: " + anotherShort);
}
}
Dans ce code mis à jour :
- Nous déclarons une variable
int
nommée largeInt
avec la valeur 40000, qui est supérieure à la valeur maximale qu'un short
peut contenir (32767).
- La ligne commentée
short myShort = largeInt;
montre ce qui se passerait sans transtypage – une erreur de compilation.
- La ligne
short myShort = (short) largeInt;
montre comment transtyper la valeur int
en short
. Le (short)
avant largeInt
est l'opérateur de transtypage.
- Nous faisons de même pour une valeur négative
anotherLargeInt
(-40000), qui est inférieure à la valeur minimale qu'un short
peut contenir (-32768).
-
Enregistrez le fichier (Ctrl+S ou Cmd+S).
-
Maintenant, compilez le programme modifié dans le terminal :
javac HelloJava.java
Cette fois, la compilation devrait réussir car nous avons utilisé le transtypage.
-
Exécutez le programme compilé :
java HelloJava
Vous verrez une sortie similaire à celle-ci :
Value of largeInt cast to short: -25536
Value of anotherLargeInt cast to short: 25536
Remarquez que les valeurs de sortie (-25536 et 25536) ne sont pas les valeurs originales (40000 et -40000). Cela s'explique par le fait que lorsque vous transtypez une valeur en dehors de la plage du type de données cible, la valeur "reboucle". Il s'agit d'un exemple de débordement (overflow) (pour les valeurs positives dépassant la valeur maximale) et de sous-débordement (underflow) (pour les valeurs négatives dépassant la valeur minimale). La valeur résultante exacte dépend de la représentation binaire des nombres. Cela montre pourquoi il est important de comprendre les plages des types de données et d'utiliser le transtypage avec précaution pour éviter des résultats inattendus.