public class Solution {
public static void main(String[] args) {
long l = (byte) 1234_564_890L;
int x = (byte) 0b1000_1100_1010;
double m = (byte) 110_987_654_6299.123_34;
float f = (byte) l++ + 10 + ++x - (float) m;
l = (long) f / 1000;
System.out.println(l);
}
}
Хотелось бы разобраться - как это вообще работает, поэтапно. Буксую на теме сужения/расширения уже неделю
Начну с `long l = (byte) 1234_564_890L`
Почему в этом выражении l = 26?
1. При сужении 1234564890L, сначала происходит попытка сузить до (int) - так?
2. В int влезает, идем дальше.
3. Пытаемся засунуть в short - не влезает.
4. Дальше ход мыслей теряется. Читал тут, но ничего не понял. Хелп.Fed Or
14 уровень
Запрашиваю пояснительную бригаду
Обсуждается
Комментарии (12)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Артем
15 апреля 2021, 08:09
В лекции нового курса лучше описан этот процесс, чем в старых лекциях, посмотрите:
https://javarush.com/quests/lectures/questsyntaxpro.level07.lecture01
0
Ksenia Volkova Java Developer в DXC Master
15 апреля 2021, 07:52
При чем тут int и short?
У тебя же там явное приведение к byte
(byte) 1234_564_890L
вот и получается 26
0
Fed Or
15 апреля 2021, 07:54
почему 26, если в byte максимум 127?
0
Ksenia Volkova Java Developer в DXC Master
15 апреля 2021, 08:04полезный
Размерность типа long - 8 байт, и число 1234_564_890L в двоичной системе будет выглядеть так:
Размерность типа byte - один байт (как ни странно). Чтобы 8 байт засунуть в один, придется отпилить все лишнее - то есть первые 7 байт числа long будут потеряны
и останется только последняя часть
что соответсвует числу 26 в десятичной системе. +2
Fed Or
15 апреля 2021, 08:14
Большое спасибо. Т.е. при сужении типов надо всегда в голове держать, что под капотом операции происходят с числами, представленными в двоичном коде.
0
Fed Or
15 апреля 2021, 08:21
int x = (byte) 0b1000_1100_1010;
1. 100011001010 - не вмещается в байт
2. Отрезаем слева знаки, чтоб влезло -> 11001010
3. Переводим в десятичную -> 202 (не влезает в размерность байта)
4. ???
5. - 54
Опять не понял(
Окей, 202 не влезает в байт, что происходит дальше? Искал статью в материалах - не нашел. Киньте плиз.
0
Ksenia Volkova Java Developer в DXC Master
15 апреля 2021, 08:31
В java byte - это signed тип, то есть со знаком.
Всего туда помещается 256 значений - но они находятся в диапазоне от -128 до 127.
При этом числа от 128 до 256 соответсвуют отрицательной части этого диапазона. Поэтому и выходит, что 202 - это ( 202 - 256 = ) -54
+2
Fed Or
15 апреля 2021, 08:53
Спасибо, но вот тут например почему-то не сходится
`double m = (byte) 110_987_654_6299.123_34;`
1. переводим в двоичную - 10000001001101001110011000001101011111011.00011111100
2. отрезаем 8 знаков справа - 11111100
3. Переводим в десятичную - 252
4. 252 - 256 = -4
5. Перевод в double = -4.0
Но нет) Консоль говорит, что будет -1.0🤔 WTF?
Кстати, правильно ли я понимаю, что если в двоичном представлении есть точка, то она тоже считается как бит? ( 1 / 0 )
0
Ksenia Volkova Java Developer в DXC Master
15 апреля 2021, 09:15
Вещественные числа выглядят не совсем так, как целые. И никакой точки там нет.
У них есть мантисса и экспонента, часть байт хранят одно, часть другое.
Вот тут можешь посмотреть.
+2
Ksenia Volkova Java Developer в DXC Master
15 апреля 2021, 09:27
По поводу твоего примера - тут твой double сначала будет преобразован в целое число типа int - и получится Integer.MAX_VALUE
А потом уже этот int будет урезан до byte.
+2
Виктор Гюго
25 мая 2021, 14:57
Доброго дня.
А можно еще раз ссылку. У меня не открывается.
0
Ksenia Volkova Java Developer в DXC Master
25 мая 2021, 15:00
Вроде открывается...
https://javarush.com/groups/posts/2255-chto-vnutri-chisla-s-plavajujshey-tochkoy-i-kak-ono-rabotaet
В любом случае, можно погуглить что-нибудь типа "java вещественные числа"
0