Int to long assign

Я пытаюсь преобразовать int и long, где я попытался назначить переменную int переменной long. Код выглядит следующим образом:

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);
}

Итак, при печати j он просто дал результат 1024. Но при печати k он показал переполнение (k= 0). Я рассмотрел эту проблему, используя эту технику, где я явно выбрал каждый i в long. то есть.

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);
}

Теперь он показал правильные значения как j, так и k. Итак, я хотел знать, почему это нужно, чтобы придать int во втором случае, но не в первом. k, будучи long, может сохранить это значение после этого тяжелого присвоения. Но почему он не был правильно назначен?

Ответы

Ответ 1

Причина в том, что ваша строка

long k = i*i*i*i;

можно считать

long k = ((i*i)*i)*i;

или...

int k1 = i*i;
int k2 = k1*i;
int k3 = k2*i;
long k = k3;

Итак, когда любой из kn переполняется, вы получаете сообщение об ошибке.

Когда вы делаете свои броски, вы, очевидно, обходите эту проблему, всегда комбинируя long вместе.

Конечно, простейшая модификация вашей начальной программы заключается в том, чтобы сразу определить i как long, а не int.

long i = 1024L;

Ответ 2

Эта проблема основана на том, что разные типы используют разный объем памяти. int и long являются целыми, разница в том, что int - 4 байта, тогда как long - 8 байт.

Позволяет немного изменить код:

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;

     }

}

В приведенном выше коде показано, что при умножении я 3 раза результат будет меньше, чем Integer.MAX_VALUE (который равен 2147483647), и когда вы умножаете его на 4 раза, результат равен 0, так как места недостаточно в бедных 4 байтах умножителей.:) Но вы можете видеть, что когда множители (правая сторона, j) имеют тип long, правильное значение печатается, и последняя печать показывает, что оператор k < Integer.MAX_VALUE является ложным, что является причиной вашего нуля.:)

Ответ 3

i*i*i*i - это все int-умножение, поэтому результирующий объект является только целым (что переполняется в вашем случае). для долгого результата вам нужно только преобразовать один из них в длинный, чтобы этого было достаточно

long k = ((long)i)*i*i*i;

Ответ 4

Вначале значение я является int и целочисленной мультипликацией, а результат i*i*i*i является целым числом и, следовательно, integer overflow.

Где, как во втором случае, вы явно указываете/делаете результат как long.

Ответ 5

1099511627776, который является результатом умножения, равен >Integer.MAX_VALUE как целочисленное умножение, поэтому после i*i*i значение будет 1073741824, но после умножения на 1024 оно выходит за пределы диапазона, что вызывает целочисленное переполнение, а k будет равно 0.

  • Вы можете наложить один из i на long
  • Умножьте с помощью 1L (1L*i*i*i*i), но NOT i*i*i*i*1L
  • Вы также можете назначить i*i*i длиннее и чем умножить на i, как этот long k =(k=i*i*i)*i;