Почему (short) (f/c) выдаёт ошибку деления на ноль, а (short) (0 + f/c + 46) уже нет?
WildTurbo
18 уровень
Как изменяется short f делённое на с?
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Павел Безумный учёный Expert
18 марта 2020, 22:48решение
Поскольку вещественный тип double приводится к целочисленному short, генерируется исключение целочисленного деления на 0:
Но если делить на 0 вещественное число, получится Infinity (бесконечность):
В следующей строке
значение выражения в скобках также будет Infinity, которое затем сужается до целочисленного типа short.
Но прежде чем сузиться до short, происходит неявное сужение положительной бесконечности до типа int, то есть до максимально возможного 4-байтного значения, которое в двоичной записи выглядит так:
Затем при сужении типа int до short отбрасываются два старших байта, и остаётся только
что как раз равняется -1:
+36
WildTurbo
20 марта 2020, 06:19
Огромное спасибо! Очень подробный ответ, теперь всё встало на свои места.
0
Andrew
29 января 2021, 10:16
почему 1111 1111 1111 1111 - это -1?
+1
Павел Безумный учёный Expert
30 января 2021, 00:37
Примитивный тип short состоит из 2 байт, или 16 двоичных разрядов. При этом старший разряд (находящийся слева) используется для установки знака числа, чтобы можно было оперировать как положительными, так и отрицательными значениями. Поэтому для записи самого значения остаётся 15 разрядов. Таким образом, при помощи 16 разрядов можно записать 32768 отрицательных чисел, ноль и 32767 положительных чисел, что суммарно даёт 65536 значений (или 2^16).
Запись положительных чисел начинается от 1, находящейся в младшем разряде (справа). По мере добавления разрядов-единиц увеличивается и значение числа:
Кодирование отрицательных чисел происходит следующим образом:
+9
Kuksh
9 мая 2021, 16:39
То есть получается Явно делить на 0 нельзя 1234/0, но если число Вещественное, то есть имеет какой-то явный тип int, byte, double и так далее, то тогда получается infinity (бесконечность) ? Так я понял? А то я мозг сломал, как это работает) Вроде пониммаю, что вот мы берем (a + f/c + b) или вроде бы (0 + 1234/0 + 46) и вроде бы это аналогично, если просто взять и подставить Именно 1234/0 без byte c = 0; Но результат будет разным.
+1
Павел Безумный учёный Expert
10 мая 2021, 11:52
Результат деления на 0 зависит от типа делимого. Если это целочисленный тип, то будет выброшено исключение ArithmeticException, например в таких случаях:
или
В первом случае делимое - это литерал типа int, во втором же примере делимое представлено переменной типа short. В обоих случаях будет выброшено исключение, поскольку делимое является целым числом.
Если в качестве делимого взять число с плавающей точкой, результатом такого деления на ноль будет бесконечность, например:
или так
Как видно из этих примеров, нет никакой разницы, является ли делимое литералом или переменной - результат деления на 0 в обоих случаях будет Infinity. +3
Kuksh
10 мая 2021, 13:00
Спасибо, теперь все стало на свои места!
0