Quelqu'un peut-il s'il vous plaît expliquer pourquoi cette déclaration suivante:
short value = (short) 100000000;
System.out.println(value);
Donne moi:
-7936
Sachant que la valeur maximale d'un court-circuit en Java est 32767 correcte?
Avec votre valeur de 100 millions, je reçois -7936. Je ne peux obtenir 16960 que si je change de 100 millions à 1 million.
La raison en est que les valeurs short
sont limitées à -32768 à +32767 et que Java ne conserve que les 16 bits les moins significatifs lors de la conversion en short
(conversion primitive a rétrécissement, JLS 5.1.3 ). Effectivement cette opération: 1 million de mod 2 ^ 16 (16 bits dans une short
) est 16960.
La façon dont vous l'avez fait ne fait que réinterpréter un nombre plus petit de bits au même emplacement de mémoire. Cela ne les change pas.
Vous voudrez probablement utiliser les fonctions max
et min
pour détecter le moment où la valeur se situe au-delà de short
et attribuer la valeur max ou min du raccourci lorsque cela se produit.
int n = 1000000;
short value = n > Short.MAX_VALUE ? Short.MAX_VALUE : n < Short.MIN_VALUE ? Short.MIN_VALUE : (short)n;
Mise à jour: plus compact:
import static Java.lang.Math.max;
import static Java.lang.Math.min;
// ...
value = (short)min(max(value, Short.MIN_VALUE), Short.MAX_VALUE);
System.out.println(value);
Voici bon article expliquant le rétrécissement et l'élargissement des conversions primitives en Java.
short s = 696; // 0000 0010 1011 1000 byte x = (byte)s; System.out.println("byte x = " + x);
Produit:
byte x = -72
Vous devez maintenant comprendre pourquoi - parce que, lorsque nous nous rapprochons de manière courte, l’octet (octet) de la JVM ignore la partie la plus significative (00000010) et le résultat (Sous forme binaire) est 10111000. Il en va de même nombre que nous examinions auparavant. Et, comme vous pouvez le constater, cette valeur est négative, contrairement à la valeur initiale .