Règles de diffusion pour les types primitifs dans Java
En java,
Il y a des types intégraux(char
/short
/int
/long
/byte
)
Il y a des types flottants(float
/double
)
Il est de type booléen(boolean
), ne faisant pas partie intégrante de type, à la différence du langage C.
Question 1)
Est-il un générique règle pour la coulée(comme par JLS) qui parle, le type peut être converti en un autre type? De bon sens, je sais que, de l'intégrale et les types flottants casting pour boolean
n'est pas autorisé
La Question 2)
Merci de m'aider à comprendre les raisons pour ci-dessous de sortie:
/*
* Casting rules for primitive types
*/
double aDoubleValue = 30000000000000000000.123438934;
int doubleToInt = (int)aDoubleValue; //stores max value 2147483647, makes sense!!
byte doubleToByte = (byte)aDoubleValue; //stores -1, why not 127?
short doubleToShort = (short)aDoubleValue; //stores -1, why not 32767?
long doubleToLong = (long)aDoubleValue; //stores 9223372036854775807, makes sense!!
float doubleToFloat = (float)aDoubleValue; //stores 3.0E19, 3.0 x 10^19 max value of float
char doubleToChar = (char)aDoubleValue; //what does this store?
source d'informationauteur overexchange
Vous devez vous connecter pour publier un commentaire.
La JLS listes
Tout le reste a besoin d'un cast explicite. Rétrécissement est un peu plus complexe:
double
àfloat
utilise la norme IEEE 754 arrondissement.(byte)0xfff == (byte)-1
;long
la valeur est convertie par l'arrondi vers zéro.long
la valeur est d'abord converti enint
par l'arrondi vers zéro. Alors la résultanteint
est convertie dans le type de cible à l'aide de conversion d'entier.Exemples:
rendements
Integer.MAX_VALUE
selon les règles d'arrondi.premiers convertis à
int
produisantInteger.MAX_VALUE
et puis la convertit enbyte
.Integer.MAX_VALUE
est0x7fffffff
d'où la valeur de l'octet0xff
qui est-1
.même: convertit à
int
produisantInteger.MAX_VALUE
.0x7fffffff
àshort
rendements0xffff
c'est à dire-1
.La chose la plus délicate est en fait la
char
de conversion.char
est un seul de caractères unicode 16 bits, doncchar doubleToChar = (char)aDoubleValue
vous donne'\uffff'
maintenant par les règles habituelles.Comme on peut le voir il y a une différence entre les nombres à virgule flottante et entier rétrécissement des opérations. Les opérations en virgule flottante faire effectivement l'arrondissement, alors que les opérations sur entiers effectuer au niveau du bit de serrage.
L'entier de la sémantique sont probablement hérité de C. Au moins la première étape du char-à-intégrale rétrécissement de la fpo sont aussi ce qui vous attend. La deuxième rétrécissement étapes, à partir de double/à flotteur à court, byte et l'omble chevalier peut paraître un peu surprenant, mais si vous avez vraiment cast flotter à court, vous devriez probablement vérifier que vous savez ce que vous faites de toute façon.