Задать вопрос
KriegeR
@KriegeR
Software Engineer

Динамическое преобразование типов и переполнение

Всем привет!

Начну с задачки, которую можно найти буквально в первой главе книги Java™ Puzzlers: Traps, Pitfalls, and Corner Cases авторства Joshua Bloch и Neal Gafter:

public class LongTest {
    public static void main(String ... args) {
      final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
      final long MILLIS_PER_DAY   = 24 * 60 * 60 * 1000;
      System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
   }
}


Каков будет результат? (Ответ внизу*)

Собственно, в этой теме я хотел бы спросить у специалистов о переполнении.
Скажем, если у нас есть int и на каком-то этапе случается переполнение. Почему бы не сделать, чтобы в этот момент выделить новую память, но уже типа long и переместить значение старой переменной туда.
Подозреваю, что сделано это из целей перформанса, но не уверен.

P. S. *лично я не ожидал, что ответом на задачку будет 5.
  • Вопрос задан
  • 4009 просмотров
Подписаться 3 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 4
leventov
@leventov
Скажем, если у нас есть int и на каком-то этапе случается переполнение. Почему бы не сделать, чтобы в этот момент выделить новую память, но уже типа long и переместить значение старой переменной туда.

Если вы говорите о поле класса или даже локальной переменной, то очевидно, что так сделать нельзя.

В приведенном примере случай немного иной — анонимное выражение вычисляется в размерности максимального операнда, а не ячейки, в которую будет записан результат. Видимо, иначе сделать нельзя, потому что именно такое поведение фиксирует JLS. То есть это продумывалось 1) в середине 90-х, 2) с оглядкой на семантику Си.

Хотя поведение и правда вредное и нелогичное.
Ответ написан
Комментировать
serso
@serso
Маскирование переполнения чисел — признанная ошибка при проектирования языка Java (читаем того же Блоха).
Ответ написан
Комментировать
@galaxy
Почему бы не сделать, чтобы в этот момент выделить новую память, но уже типа long и переместить значение старой переменной туда

В отличии от Java, разработчики хороших языков (PHP) не остановились на подобном половинчатом решении и пошли дальше — они конвертят сразу в double, что очень логично и удобно для программистов, ведь можно, например, посчитать возраст вселенной в наносекундах.
Строка, начинающаяся на цифру, может быть ожидаемо сконвертирована в int, а начинающаяся с фигурной скобочки — в object, ой, это в PHP6…
Анекдот вспоминается: нам бы ваши проблемы, Марь Иванна
Ответ написан
cypok
@cypok
javac без каких-либо сожалений херит численные final поля и переменные, подлец!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы