float f = (float) 128.50;
int i = (byte) f;
Т.к. 128.50 выходит за пределы диапазона значений byte, в i присвоилось -128, т.е. минимальная граница типа. Но почему именно минимальная, а не максимальная (127), которая, по сути, ближе к 128.50? Всегда ли при сужении типа берется минимальная граница?ira
15 уровень
Задачу решила, но есть вопрос
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
JustinianJudge в Mega City OneMaster
4 августа 2019, 11:36решение
Копипаст коммента Ивана Мозгачева с Обсуждения задачи:
"потому что byte это числа в диапозоне от -128 до 127 это 256 значений. Но в байте нет столько разрядов, чтобы получить 256, т.к. старший бит отводится для знака, а 1111 1111 это -1 в десятичной. Поэтому получается что все числа с 1 в старшем бите это инвентированное положительное число дополненное 1.
Т.е.
0000 0000 = 0
0000 0001 = 1
Отрицательное значение для 1
инвентируем:
1111 1110 = -2
добавляем 1
1111 1111 = -1
Это базис бинарных систем счисления ограниченных байтом.
Следовательно
0111 1111 = 127 это последнее положительное число для байта в десятичной
добавим 1
1000 0000 = -128 крайнее минимальное значение для байта в десятичной
Подводя итоги
1. в двоичной системе счисления старший бит отвечает за знак
2. сложение всегда выполняются в двоичном виде и никак иначе.
Поэтому с точки зрения бинарного сложения числа
0111 1111 (127)
+
0000 0001 (1)
=
1000 0000 (-128) является константой
Все верно посчитано, но т.к. старший бит это знак мы и получаем в десятичной отрицательое значение -128 (т.е. как бы 127 + 1 = 128 и знак противоположный)
А дальше с прибавлением единицы значение в десятичной будет увеличиваться -127, -126 и т.д.
Надеюсь стало понятно =)
Ах, да. и в результате ответ на вопрос: 128.5 приводя к байту мы приводим к int отбрасывается дробная часть, получается 128 в десятичной или в двоичной для int'a это куча битов (32)
0000 0000 0000 0000 0000 0000 1000 0000 = 128 (int)
далее пытаемся уместить в байт (0000 0000)
Тогда старшие 24 бита отрезаются
0000 0000 0000 0000 0000 0000 1000 0000 = 128 (int)
И получаем 128 в представлении байта
1000 0000 = -128 (byte) т.к. 1 теперь это старший бит а это знак как уже было расказано выше.
И вот еще статейка небольшая про числа
http://av-assembler.ru/asm/afd/asm-negative-numbers.htm
"
+5
ira
4 августа 2019, 11:46
спасибо большое
0
Самуил Олегович
4 августа 2019, 11:33
Насколько я помню, в двоичном коде при превышении порога впереди появляется единица вместо нуля и число становится отрицательным. Округления тут не причем. Сам механизм почему так происходит сейчас так сходу не вспомню.
+1