int pour mission

J'ai essayé ce type int et long de conversion où j'ai essayé d'assigner une int variable à un long variable. 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);
}

Donc, lors de l'impression j, il ne fait que donner une sortie de 1024. Mais lors de l'impression k, il a montré un dépassement de capacité (k=0). J'ai réglé ce problème en utilisant cette technique, où j'ai explicitement coulé chaque i à 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 a montré des valeurs correctes de deux j et k.
Donc, je voulais savoir pourquoi est-ce qu'il faut pour lancer int dans le second cas, mais pas dans le premier. k, étant un long pouvez conserver cette valeur après cette lourde mission. Mais, pourquoi il n'est pas été correctement attribué?

casting premier i à long devrait être assez
((long)i)*iije
Le défaut du modèle que vous avez identifié -- une multiplication de nombres entiers qui peut déborder, qui est converti en "trop tard" pour une plus grande type -- est relativement commun dans les deux C# et Java; nous trouvons plus de cinq occurrences par million de lignes de code analysé. Une relative défaut avec un même taux de découverte est une division de deux entiers et un "trop tard" conversion en double; les gens sont souvent surpris de constater que trois cent divisé par cinq cents et affecté à un double zéro, pas de 0.6.

OriginalL'auteur Shashish Chandra | 2014-07-15