Задача №6 на преобразование целых типов

  • 3
  • Недоступна
Вот и шестая задача цикла «Преобразование целых типов» подоспела. Мы тут почему стараемся? Хотим, чтобы вы усвоили эти приемы так, чтобы не приходилось переучиваться. В этот раз в нашей задаче операторов приведения типов слишком много, затесались лишние. Найдите их и уберите, чтобы получить требуемый ответ.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (131)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Bombus 11 уровень, Москва
25 февраля, 08:20
Очень удобно решать в Debug режиме.
AlexeyN 15 уровень
13 января, 13:53
Вообще не понимаю как оно там считается. Делаю чисто наугад методом тыка. Например, ответ должно быть число 1000,0. А задача первоначально выдает - 311,5. Где у нас есть 0,5, чтобы убрать ее в ответе. Правильно в строке float f = (short) 0.50f; Следовательно переменную в этой строке нельзя приводить к целому.... ) ОК. теперь имеем ответ -311,0 и что дальше. А дальше смотрим на формулу и думаем, что нужно сделать чтобы увеличить ответ на столько, чтобы значение перешло в положительную часть оси чисел. Надо увеличить переменную i. Вот так я и получил правильны ответ. Но нихрена не понял как это работает!. Как из 150 000 при переводе получается 18729 это выше моего понимания. Почему в этом куске кода деление на '100' работает как деление на 100, а в предыдущих примерах арифметика не работала с ' '... Вроде такая простая тема, но я ее понял хуже всего.
piupiuu 19 уровень, Korolëv
27 января, 18:35
int i = (short) 150000 : в двоичной системе 150 000 = 100100100111110000. Short имеет размер 2байта это равно 16бит. Поэтому значение i в int усекается до 16 правых разрядов. То есть 0100100111110000. Если перевести в 10 систему счисления это будет 18928. Я не знаю, откуда ты взял 18729 =)
piupiuu 19 уровень, Korolëv
27 января, 18:46
Почему в этом куске кода деление на '100' работает как деление на 100: тут вроде как ты считаешь в int 150 000/100 (потому что символ d в юникоде это 100), получаешь 1500 и потому уже результат приводишь к double, вот и появляется 1500.00. А с char ты можешь производить арифметические действия, такие же как с числами.
piupiuu 19 уровень, Korolëv
27 января, 21:34
И кстати, очень важно, если ты разбиваешь int i = (byte) 2250, то в результате будет отрицательное число. 2250 в двоичной системе будет 1000_1100_1010, оставили 8 правых разрядов, получилось 1100_1010 = 202 в десятичной. Дальше: -128 + (202-128) = -54. Где 128 - это нижняя граница byte. То есть, если у тебя при разбивке получилось двоичное число, которое начинается на 1, то оно всегда будет отрицательное.
Никита Никитенко Сыч в Сычевальне
15 декабря 2020, 23:41
Интересный момент обнаружился... получается что есть 2 уровня приведения: литералом и оператором (литерал как бы суффикс, а оператор префикс). Так вот! Сначала срабатывает литерал, а потом - оператор в начале числа! (почему там стоит d? Не забываем что числа в Java по дефолту считаются int, если нужно иное то это нужно явно указать - d в конце, значит double). Да, плюс там еще и экспоненциальная запись числа (e2).
double d = (short) 2.50256e2d;
Естественно в лекциях про это ни слова... все сами, как обычно
Никита Никитенко Сыч в Сычевальне
15 декабря 2020, 23:43
Я : "ШТА"?? Лектор : Префикс, от лат. - "прикреплённый впереди". Суффикс от лат. "прикреплённый вза.... кхэм, а впрочем не будем об этом... Я : гы гы )))
Александр Артихович 19 уровень, Минск
17 декабря 2020, 11:04
d там не нужен совсем, так как все вещественные числа по умолчанию считаются как double. Если убрать эту d - ничего не изменится, так как в числе есть точка и оно сразу становится double и без буквы d. А вот в случаях с float и long буквы актуально указывать.
Никита Никитенко Сыч в Сычевальне
17 декабря 2020, 13:57
Да, очевидно это так. В этом месте задачи (и не только в этом) "d" использовалась для дополнительного запутывания студентов. Ведь как нас заранее предупредили задачу разработал специально сам профессор Нудлс )))
Виктор 19 уровень
10 декабря 2020, 10:34
Забиваем, ниже строки вывода на экран, еще 5 sout, в которых выводим отдельно каждую переменную. Удивляемся увиденному. Играем с операторами приведения типа и наблюдаем за результатом. Методом исключения быстро приходим к правильному решению))
Илья 11 уровень, Москва
6 декабря 2020, 14:41
Не хватает еще подколов(хотел другое слово написать) со стороны компилятора в духе "Ты конечно же не экстрасенс но предвидеть это должен был!"
Арсений Студент в СпбГМТу
27 ноября 2020, 09:58
Мне нравится, что i/c (18729/"d")=189
Dmitrii 17 уровень
15 декабря 2020, 19:18
'd' в десятичной системе 100, шестнадцатиричный код '\uoo64'. "d" и 'd' только из далека выглядят одинаково
Vsevolod 13 уровень, Москва
26 ноября 2020, 23:09
и ни одного комментария о том, зачем в конце 9-й строки стоит литерал d 🤦‍♂️
Павел студент на стероидах в Java Syntax Pro beta
27 ноября 2020, 05:29
не запрещено, значит разрешено 🤪 A floating-point literal is of type float if it ends with the letter F or f; otherwise its type is double and it can optionally end with the letter D or d.
Евгений Р 22 уровень, Иркутск
15 октября 2020, 13:48
Для понимания какие где числа будут сделал так - System.out.println(f + " + " + "(" + i + " / " + (int)c + ")" + " - (" + d + " * " + s + ") - " + 500e-3 ); Потом при смене/удалении операторов приведения типов видел, что там происходит внутри. PS не забудьте удалить/закоментить потом это, а то потеряете попытку.
Станислав 19 уровень, Москва
11 октября 2020, 12:06
Подсказка: хватает 2 типов short. Один для компиляции, второй для нужного числа.
aleksdenni 22 уровень, Полтава
6 октября 2020, 20:03
24525-й. Угадал ) С второй попытки , даже не пробовал считать ) Хотя и так видно что переменная char ни на что не влияет , а для short (short) чтобы с double перевести.