почему 24 * 60 * 60 * 1000 * 1 000 разделенных 24 * 60 * 60 * 1000 не равен 1 000 в Java?

Я начал программировать Jan 2-й 1980. Я попытался думать о существенно новых изобретениях по своей карьере. Я изо всех сил пытаюсь думать о любом. Большая часть того, что я считаю значительными, была на самом деле изобретена до 1980, но затем не была широко принята или улучшилась до окончания.

  1. Графический интерфейс пользователя.
  2. Быстрая обработка.
  3. Память большой емкости (я заплатил 200,00$ за 16k в 1980).
  4. Небольшие размеры - сотовые телефоны, Pocket PC, iPhone, Нетбуки.
  5. Большие емкости хранения. (Я пошел от переноса большой 90k дискеты к карте флэш-памяти usb на 8 ГБ.
  6. процессоры Multiple. (Почти все мои компьютеры имеют больше чем один теперь, программное обеспечение изо всех сил пытается заставить их напряженно трудиться).
  7. Стандартные интерфейсы (как USB) для легкого присоединения периферии.
  8. Несколько Сенсорных дисплеев.
  9. Сетевое соединение - ведущий к интернет-взрыву середины 90-х.
  10. IDE с Intellisense и возрастающей компиляцией.

, В то время как аппаратные средства улучшили чрезвычайно промышленность программного обеспечения, изо всех сил пытался поддержать на высоком уровне. Мы - световые годы перед 1980, но большинство улучшений было улучшениями, а не изобретениями. С 1980 мы были слишком заняты, применив то, что продвижения позволяют нам сделать вместо изобретения. Собой большинство этих возрастающих изобретений не важно или мощно, но когда Вы оглядываетесь назад за прошлые 29 лет, они довольно мощны.

Мы, вероятно, должны охватить последовательные усовершенствования и регулировать их. Я полагаю, что действительно исходные идеи, вероятно, прибудут от людей с небольшим воздействием компьютерам, и они становятся более твердыми найти.

13
задан cherouvim 19 August 2009 в 17:35
поделиться

3 ответа

Поскольку при умножении происходит переполнение 32-битных целых чисел. В 64 битах это нормально:

public class Test
{
    public static void main(String[] args)
    {
        int intProduct = 24 * 60 * 60 * 1000 * 1000;
        long longProduct = 24L * 60 * 60 * 1000 * 1000;
        System.out.println(intProduct); // Prints 500654080
        System.out.println(longProduct); // Prints 86400000000
   }
}

Очевидно, что после того, как умножение переполнилось, деление не собирается «отменять» это переполнение.

60
ответ дан 1 December 2019 в 17:11
поделиться

Вам нужно начать с 24L * 60 * ... из-за переполнения int.

Ваш вопрос, кстати, является копией / вставкой Головоломки 3: Длинное деление из Java Puzzlers ;)

22
ответ дан 1 December 2019 в 17:11
поделиться

Если вы хотите выполнить это вычисление, вы должны либо изменить порядок операций (чтобы избежать переполнения), либо использовать больший тип данных. Настоящая проблема состоит в том, что арифметика целых чисел фиксированного размера в Java не ассоциативна; это больно, но есть компромисс.

3
ответ дан 1 December 2019 в 17:11
поделиться
Другие вопросы по тегам:

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