long
может хранить гораздо большие значения - поэтому в вашем коде должно быть что-то конкретное.Я догадался о том, что делает ваш код, посмотрите, выглядит ли это знакомо:
class Out {
public static void main(String args[]) {
long l = 40L * 1024 * 1024 * 1024;
double d = 40.0 * 1024 * 1024 * 1024;
System.out.println("long l: " + l + " double d: " + d + "\n");
return;
}
}
$ vim Out.java ; javac Out.java ; java Out
long l: 42949672960 double d: 4.294967296E10
Обратите внимание, что мне пришлось умножить 40L
, а не просто 40
- если все целые числа даны как целые литералы,без конкретных L
long
аннотаций Java будет интерпретировать все выражение как int
.При тестировании с L
и без него (и умножении на 1024 * 1024 * 102
, что подтверждает мою гипотезу), я обнаружил, что различия интересны:
$ vim Out.java ; javac Out.java ; java Out # with only '40'
long l: -16777216 double d: 4.294967296E10
$ vim Out.java ; javac Out.java ; java Out # with '40L'
long l: 4278190080 double d: 4.294967296E10
Надеюсь, это поможет объяснить, почему это важноуказывать типы литеральных типов данных в коде.