Почему компилятор выдаёт -1. Ведь там явное деление на ноль.
Расставьте правильно операторы приведения типа, чтобы получился ответ: d > 0
int a = 0;
int b = (byte) a + 46;
byte c = (byte) (a*b);
double f = (char) 1234.15;
long d = (short) (a + f / c + b);
Станислав
26 уровень
Почему компилятор выдаёт -1. Ведь там явное деление на ноль.
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Founder
4 апреля 2018, 01:44
Подсказка: какой тип всегда больше нуля ?
+2
VN
22 апреля 2019, 14:27
Хм.. у меня без чаров прошло всё
+2
Pomidor
22 октября 2017, 18:39
сделай лог в консоль каждого действия отдельно, в частности посмотрите чему равно f/c
узнаете что в double у нас есть несколько уникальных значений типа Infinity
в классе обертке Double, например такие константы
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
ну, а потом пытаемся обрезать (поместить в short),
тут я точно не знаю, по идее далее возвращает "-1" - что по сути не удалось
+2
Pomidor
22 октября 2017, 18:52
спецификация
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
0
ilya
27 ноября 2017, 05:00
-1 выдает когда не удается запихать бесконечность в short ?
почему когда я пихаю в short 32769 результат получается -32767 ?
0
Pomidor
27 ноября 2017, 06:17
почему когда я пихаю в short 32769 результат получается -32767 ?
тут просто, мы ничего не теряем, обрезая, ибо short весьма большой 16 бит от -32768 до 32767
byte и short теряют значения, если огромный int запихать в них или более.... почему, читайте спецификацию выше...
можете поиграться:
class Test {
public static void main(String[] args) {
float fmin = -32768f ;
float fmax = 2147483642f;
// float fmin = Float.NEGATIVE_INFINITY;
// float fmax = Float.POSITIVE_INFINITY;
System.out.println("long: " + (long)fmin +
".." + (long)fmax);
System.out.println("int: " + (int)fmin +
".." + (int)fmax);
System.out.println("short: " + (short)fmin +
".." + (short)fmax);
System.out.println("char: " + (int)(char)fmin +
".." + (int)(char)fmax);
System.out.println("byte: " + (byte)fmin +
".." + (byte)fmax);
}
}
0
ilya
27 ноября 2017, 06:26
я имел ввиду, почему инверсия с + на - идет.
ладно, почитаю.
спасибо!
0
Pomidor
27 ноября 2017, 08:17решение
упсcc, не о том я вам тогда :-)
если коротко, если идет превышение диапазона, то число идет по кругу...
скажем есть int 2147483647 (максимальное) , если к нему прибавить + 1.... то число становится -2147483648 ... т.е. заходит на новый круг...
и наоборот был Int -2147483648 (минимальный) убавили его -1, получили 2147483647
кольцо этакое _-2147483648.......2147483647_-2147483648.........2147483647_-2147483648......
причины почему так сделано не знаю
+10
ilya
27 ноября 2017, 09:47
воу, интересно!
Спасибо!
0
Mike
27 марта 2018, 01:10решение
при попытке преобразовать бесконечность в short будет 2 операции - сначала преобразовываем в максимальный положительный элемент типа int, а потом обрезаем это число до short, причем обрезание происходит простым отбрасыванием старших битов. Для типа int максимальное число - это 1111..111 (31 единица), отбрасываем старшие биты и получаем все единицы, а так как первый бит - отвечает за знак, где 1 - это знак минус, вот и выходит -1. Вот здесь еще подробнее описано - http://old.intuit.ru/department/pl/javapl/7/1.html, пролистайте ближе к концу страницы
+12