2015-08-24 2 views
1

У меня есть функция, которая ожидает, что в качестве одного из параметров будет длинное значение.Арифметическое выражение, которое не разрешается при вызове функции

void doSomething(long limit, ...) { 
//statements 
} 

в вызове функции я передать аргумент как,

doSomething(5 * 1024 * 1024 * 1024, ...); 

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

+1

положить его '5л * 1024 * 1024 * 1024' (примечание * L * после 5), чтобы быть 'long' –

+0

Кроме того, вам следует избегать магических чисел; вместо этого используйте константу 'long', например. 'private static final long SIZE = 5L * 1024 * 1024 * 1024;'. –

ответ

3

Посмотрите на номер 5368709120. Диапазон значений целых чисел: -2,147,483,648 to 2,147,483,647

Целочисленное переполнение происходит там. Результирующее значение в параметре (5 * 1024 * 1024 * 1024), пересекающем границу максимального значения int. Преобразование любого значения в длинные, так что результат будет сохранен в long

doSomething(5L * 1024 * 1024 * 1024, ...); // look the literal L after 5 
+0

Выражения типа '5 * 1024 * 1024 * 1024L' * опасны *, поскольку' * 'остается ассоциативным: вы можете иметь * целочисленное переполнение * в' 5 * 1024 * 1024 ... * '* до * достижения' 1024L'. Способ Safier состоит в том, чтобы пометить '5' суффиксом' L': * следующее выражение длинное * –

+0

@DmitryBychenko Ah.fair point. Ред. –

0

Потому что ваш вызов посылает int, который затем коробочный как long после того, как операция была выполнена в int.

Операция, выполняемая как int, переполнена Integer.MAX_VALUE (2147483647) и возвращает нежелательные результаты.

Вы можете отдать свой операцию long следующим образом:

doSomething((long)5 * 1024 * 1024 * 1024, ...); 

Вы также можете проверить распечатывания значения:

System.out.println(5 * 1024 * 1024 * 1024); // overflowing 
System.out.println((long)5 * 1024 * 1024 * 1024); // casted, not overflowing Long.MAX_VALUE 

Выход

1073741824 
5368709120 

 Смежные вопросы

  • Нет связанных вопросов^_^