Умножение длинных значений?
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;
!
Ответы
Ответ 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
}
}