J'ai essayé cette conversion int et longue où j'ai essayé d'assigner une variable int
à une variable long
. Le code est comme suit:
public static void main(String []args){
int i = 1024;
long j = i;
long k = i*i*i*i;
System.out.println("j= " +j+ ", k= " +k);
}
Ainsi, lors de l'impression de j
, il a simplement donné une sortie de 1024
. Mais lors de l'impression de k
, il a montré un débordement (k
= 0). J'ai résolu ce problème en utilisant cette technique, où j'ai explicitement casté chaque i
en long
. c'est à dire.
public static void main(String []args){
int i = 1024;
long j = i;
long k = ((long)i)*((long)i)*((long)i)*((long)i);
System.out.println("j= " +j+ ", k= " +k);
}
Maintenant, il montrait les valeurs correctes de j
et k
. Donc, je voulais savoir pourquoi cela est nécessaire pour lancer int
dans le deuxième cas mais pas dans le premier. k
, étant un long
peut conserver cette valeur après cette lourde affectation. Mais pourquoi n'est-il pas correctement attribué?
La raison en est que votre ligne
long k = i*i*i*i;
peut être considéré comme
long k = ((i*i)*i)*i;
ou...
int k1 = i*i;
int k2 = k1*i;
int k3 = k2*i;
long k = k3;
Ainsi, lorsque l'un de kn
déborde, vous obtenez l'erreur.
Lorsque vous effectuez vos conversions, vous contournez évidemment ce problème en multipliant toujours long
s ensemble.
Bien entendu, la modification la plus simple de votre programme initial consiste à définir i
comme un long
immédiatement, au lieu d'un int
.
long i = 1024L;
Ce problème est basé sur le fait que différents types utilisent une quantité de mémoire différente. int et long sont tous les deux des entiers, la différence est que int est 4 octets, tandis que long est de 8 octets.
Permet de modifier un peu votre code:
public class Test {
public static void main(String []args){
int i = 1024;
long j = i;
long k = i*i*i;
System.out.println("My multipliers are of type int:");
System.out.println("j= " +j+ ", k= " +k);
System.out.println("Is k less than Integer.MAX_VALUE: " + (k < Integer.MAX_VALUE? "YES" : "NO"));
k = i*i*i*i;
System.out.println("j= " +j+ ", k= " +k);
//now multiplying with j instead of i
System.out.println("\nNow Im working with a long type:");
k = j*j*j;
System.out.println("j= " +j+ ", k= " +k);
System.out.println("Is k less than Integer.MAX_VALUE: " + (k < Integer.MAX_VALUE? "YES" : "NO"));
k = j*j*j*j;
System.out.println("j= " +j+ ", k= " +k);
System.out.println("Is k less than Integer.MAX_VALUE: " + (k < Integer.MAX_VALUE? "YES" : "NO"));
k = j*j*j*j;
}
}
Le code ci-dessus montre que lorsque vous avez multiplié i 3 fois le résultat est une valeur inférieure à Integer.MAX_VALUE (qui est 2147483647), et lorsque vous le multipliez 4 fois, le résultat est 0 car il n'y a pas assez de place dans les pauvres 4 octets des multiplicateurs. :) Mais vous pouvez voir que lorsque les multiplicateurs (côté droit, j) sont de type long, la valeur correcte est imprimée et la dernière impression montre que l'instruction k <Integer.MAX_VALUE est fausse, ce qui est la raison de votre zéro . :)
i*i*i*i
est une multiplication tout entier, donc la résultante est uniquement un entier (ce qui déborde dans votre cas). pour une longue résultante, il vous suffit de convertir l'un d'eux en long donc c'est suffisant
long k = ((long)i)*i*i*i;
Dans un premier temps, la valeur de i est un int et la multiplication entière se produisant et i*i*i*i
le résultat est un entier et donc integer overflow.
Où comme dans le deuxième cas, vous dites/faites explicitement le résultat comme long
.
1099511627776
Qui est le résultat de la multiplication est >Integer.MAX_VALUE
Car c'est une multiplication entière donc après i*i*i
La valeur serait 1073741824
Mais après multiplication avec 1024
il devient hors de portée ce qui provoque débordement d'entier et k sera 0.
i
en long
1L
(1L*i*i*i*i
) Mais PAS i*i*i*i*1L
i*i*i
À long et à multiplier par i
comme ceci long k =(k=i*i*i)*i;