web-dev-qa-db-fra.com

int à longue affectation

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é?

15
Shashish Chandra

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;
19
dav_i

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 . :)

7
Ranic

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;
6
Sanjeev

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.

2
Suresh Atta

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.

  • Vous pouvez convertir l'un des i en long
  • Multipliez avec 1L (1L*i*i*i*i) Mais PAS i*i*i*i*1L
  • Vous pouvez également affecter i*i*i À long et à multiplier par i comme ceci long k =(k=i*i*i)*i;
2
CoderCroc