Умножать длинные значения?

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;

Ответы на вопрос(5)

ак целые числа, а не как long. Таким образом, без L на 80 умножение переполняется.

Этот код:

long value = 1024 * 1024 * 1024 * 80; 

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

Поскольку int 32-битный, значение оборачивается и приводит к нулю.

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

Решение Вопроса

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

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

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

 Erich30 сент. 2009 г., 00:35
Это на самом деле звучит знакомо, и это довольно надежное правило, имеет смысл, что так оно и будет. Я думаю, что long + float выполняется как double, поэтому вы можете сделать 5 / 3.0 и заставить его работать.
 urmalp29 сент. 2009 г., 23:06
то есть короткий х = 0; короткий у = 0; х = х + у; даст ошибку несоответствия типов.
 Erich29 сент. 2009 г., 23:24
Prateek- это неТем не менее, компилятор достаточно умен, чтобы провести различие.
 Tom Hawtin - tackline29 сент. 2009 г., 22:57
Арифметика, скажем,shorts isn 'сделано какshortсидеть'сделано какints.
 Tom Hawtin - tackline30 сент. 2009 г., 00:10
Эрих: целочисленная арифметика безlong сделано какint, Арифметика с плавающей точкой безdouble сделано какfloat (Я думаю, я забыл, что происходит, вы делаетеlong+float). Мне все еще нравится произвольная арифметика точности.
 Tom Hawtin - tackline30 сент. 2009 г., 00:07
Праттек: ЕстьТам немного набирается текста. Вы также можете сделатьmyShort += anotherShort; но нетmyShort = myShort + anotherShort;, Мне нравятся точные целые числа aribtrary ...
 Erich29 сент. 2009 г., 23:02
Том - это очень интересно, яЯ никогда не знал этого. Я только что проверил его с двумя шортами (в C #, но с похожим действием), и он сделал математические вычисления как целое число ... Он должен просто использовать Int в качестве значения по умолчанию для простых числовых типов.

Если я правильно понял, по вашему требованию, вы хотели бы умножить эти значения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
    }
}

Целочисленные литералыints.intс переполнением. ИспользоватьL суффикс.

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

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

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

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

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

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

Ваш ответ на вопрос