Подтвердить что ты не робот

Умножение длинных значений?

class Main {  
   public static void main (String[] args){  
     long value = 1024 * 1024 * 1024 * 80;  
     System.out.println(Long.MAX_VALUE);  
     System.out.println(value);  
  }  
}

Выход:

9223372036854775807
0

Правильно, если long value = 1024 * 1024 * 1024 * 80L;!

4b9b3361

Ответ 1

В Java вся математика выполняется в самом большом типе данных, требуемом для обработки всех текущих значений. Итак, если у вас есть int * int, он всегда будет делать математику как целое число, но int * long выполняется как long.

В этом случае 1024 * 1024 * 1024 * 80 выполняется как Int, который переполняет int.

"L", конечно, заставляет один из операндов быть Int-64 (длинным), поэтому вся математика выполняется для хранения значений как Long, поэтому переполнение не происходит.

Ответ 2

Целочисленные литералы int s. Переполнение int. Используйте суффикс L.

long value = 1024L * 1024L * 1024L * 80L;

Если данные поступают из переменных, которые были переданы или назначены длинным заранее.

long value = (long)a * (long)b;

long aL = a;
long bL = b;
long value = aL*bL

Строго говоря, вы можете избежать неприятностей, но, вероятно, лучше быть понятным.

Также не нижний регистр L в качестве суффикса можно путать как 1.

Ответ 3

Я подозреваю, потому что по умолчанию java обрабатывает литералы как целые числа, а не longs. Таким образом, без L на 80 умножение переполняется.

Ответ 4

Этот код:

long value = 1024 * 1024 * 1024 * 80; 

умножает некоторые целые числа, преобразует их в длинный и затем присваивает результат переменной. Фактическое умножение будет выполняться javac, а не при его запуске.

Так как int - 32 бита, это значение обернуто и приводит к нулю.

Как вы говорите, использование длинных значений в правой части даст результат, который только обертывает, если он превышает 64 бит.

Ответ 5

Если я правильно понял это, в соответствии с вашим требованием, вы хотели бы умножить эти значения 1024 * 1024 * 1024 * 80;

В калькуляторе я вижу значения, следующие 1024 * 1024 * 1024 * 80 = 85899345920.

Здесь вы вводите код java: это расчет денежного значения в java

import java.math.BigDecimal;
public class Demo {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal("1024");
        BigDecimal bd2 = new BigDecimal("1024");
        BigDecimal bd3 = new BigDecimal("1024");
        BigDecimal bd4 = new BigDecimal("80");
        BigDecimal bd5 = bd1.multiply(bd2).multiply(bd3).multiply(bd4);
        System.out.println(bd5); // output comes: 85899345920
    }
}