Почему при перемножении переменных correction со значением -10 и fahrenheit -419.67, в результате получается 100? Это как вышло?
Arina Fonova
30 уровень
Почему так умножаются переменные
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Mansur Rasulev
25 мая 2022, 06:07
byte принимает 256 значений от -128 до 127
-10* -419.67 = 4196.7 откидывается дробная часть ,остается 4196
В 4196 число 256 помещается 16 раз. 100- это остаток от деления
4196- 256*16=100
0
hidden #598481
25 января 2022, 11:29решение
Потому что у тебя correction имеет тип byte.
Сначала выполнится умножение, в процессе умножения выполнится неявное приведение к double:
-10 * -419.67 = 4196.7
Дальше ты пытаешься записать это значение в byte, а это значит что отбрасываются все байты дробной части, и получается число 4196.
4196 в двоичной системе счисления это 1000001100100
Байт - это 8 бит, то есть при приведении числа 4196 к типу byte остаются только 8 правых разрядов от этого числа: 01100100
А 01100100 - это 100 в десятичной системе счисления.
Именно поэтому byte может хранить только величины от -128 до 127, т.к. 10000000 - это -128, а 01111111 это 127.
+2
Денис Java Developer
25 января 2022, 11:05
Потому что *= это не операция умножения, это операция присвоения результата. А присваиваешь ты его переменной типа byte, ее же и выводишь в консоль. Какие значения может принимать byte ты могла читать в лекциях.
0
hidden #598481
25 января 2022, 11:34
почему же не умножения? Умножение же тоже выполняется, а затем уже присвоение.
0
Денис Java Developer
25 января 2022, 12:04
ну так я так и написал ) присвоения результата. Посмотри в чем будет разница между просто умножением и таким присвоенным.
Мне вот любопытно можно ли число восстановить из этого состояния. Но думаю вряд ли получится. Все таки для double нужно сильно больше одного байта.
0
hidden #598481
25 января 2022, 12:19
Ну правильно-то сказать, что это две операции, умножение и затем присвоение, а не "не умножение, а присвоение", как ты говоришь.
Посмотри сам, я выше всё расписал, как оно выполняется.
Разумеется, отброшенные биты отброшены безвозвратно, и из восьми оставшихся байт ты ничего кроме них не получишь.
0
Денис Java Developer
25 января 2022, 12:32
Правильно сказать, что операция умножения тут ни при чем, а источник вопроса - неявное сужение типа при операции присвоения :)
Нельзя запихнуть 8 байт в 1 и ожидать "корректный" результат, а само умножение выполняется здесь без каких либо проблем и ни на что не влияет и если бы в коде было, например,
Никто бы ничего не заметил, из-за опять таки неявного, но уже расширения типа. 0