web-dev-qa-db-fra.com

Java - Conversion explicite d'Int en Short

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?

7
Octocat

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.

19
rgettman

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);
2
necromancer

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 .

0
tworec