|
1 / 1 / 0
Регистрация: 09.06.2012
Сообщений: 105
|
||||||
Изменение значения при приведении типов17.12.2013, 22:19. Показов 2457. Ответов 17
Метки нет (Все метки)
Привет форумчане! Вот часть программы:
s после присваивания 64000: -1536 -- с потерей данных. Вопрос: откуда 1536? Это ведь не рандомно определяется, было бы глупо). Спасибо заранее)
0
|
||||||
| 17.12.2013, 22:19 | |
|
Ответы с готовыми решениями:
17
FormatException не обработано при приведении типов
|
|
Администратор
|
||||||
| 17.12.2013, 22:28 | ||||||
0
|
||||||
|
1 / 1 / 0
Регистрация: 09.06.2012
Сообщений: 105
|
|||
| 17.12.2013, 22:45 [ТС] | |||
|
0
|
|||
|
Администратор
|
|||||||
| 17.12.2013, 22:55 | |||||||
|
У типа short верхняя граница: 32767, как только мы её переходим при приведении типов short принимает наименьшее возможное значение, т.е. -32768. По мере увеличения значения в int значение short тоже увеличивается
31232 - 32768 = -1536, понятнее будет -32768 + 31232 = -1536 : после переполнения начинаем отсчёт с (-32768)
1
|
|||||||
|
1 / 1 / 0
Регистрация: 09.06.2012
Сообщений: 105
|
|
| 17.12.2013, 23:42 [ТС] | |
|
tezaurismosis, Ок, не понял только, почему при подсчитывания величины, на которую мы переполнили short, мы вычитаем из присваемого значения именно нижнюю границу(32768), а не верхнюю(32767), что логичней вроде(сори если туплю)
0
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
|||
| 17.12.2013, 23:52 | |||
1
|
|||
|
1 / 1 / 0
Регистрация: 09.06.2012
Сообщений: 105
|
|
| 18.12.2013, 00:21 [ТС] | |
|
Так , то есть:
1) т.к. 64000>верхней границы(32767) переменной s присваивается значение нижней границы(-32768); 2) далее это значение увеличивается на 64000 >= s становится равным 31232; Так? Тогда зачем еще что-то делать???
0
|
|
|
Master of Orion
|
||||||
| 18.12.2013, 00:31 | ||||||
|
jammad621, помедитируйте на этот метод:
1
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 18.12.2013, 14:28 | ||
Сообщение было отмечено как решение
РешениеКогда вы преобразовываете int в short, то все лишние старшие байты просто отбрасываются и результирующее значение будет образовано оставшимися младшими байтами. В случае преобразования int (4 байта) в short (2 байта), будут отброшены старшие два байта. Итак, число 64000 в формате int в двоичном виде имеет такой вид: 0000 0000 0000 0000 1111 1010 0000 0000 При преобразовании в short, размер которого равен двум байтам, старшие байты отбрасываются и используются только младшие два, так что значение приобретает такой вид: 1111 1010 0000 0000 Тип short является знаковым, значит он представлен в памяти дополнительным кодом, где самый старший бит указывает на знак числа (1 — отрицательное, 0 — положительное), а все последующие определяют собственно значение. В получившемся представлении видно, что старший бит имеет значение 1, а значит число будет отрицательным. В случае отрицательного числа значение высчитывается таким образом: из числа, полученного установкой максимального бита в единицу (как если бы оно было беззнаковое) вычитается число, образованное всеми оставшимися битами, и ставится знак минус. На примере выше, из первого вычитается второе: 1000 0000 0000 0000 (32768) 0111 1010 0000 0000 (31232) 0000 0110 0000 0000 (1536) Результат: 1536 со знаком минус или –1536. Ну и для полноты картины: значение это инвертируется и к нему добавляется единица, получается вышеприведенная запись двоичного числа: ~0000 0110 0000 0000 + 1 = 1111 1001 1111 1111 + 1 = 1111 1010 0000 0000 Можно объяснить еще проще. Беззнаковое число из двоичной системы переводится в десятичную по такой формуле: Где n — количество разрядов, i — текущий разряд, а x — значение текущего разряда. На примере со значением 64000: 1111 1010 0000 0000 = Знаковое же число, представленное дополнительным кодом, переводится в десятичную систему счисления по такой формуле: Всё то же, но значению из старшего разряда присваивается знак минус. Получаем:
4
|
||
|
Master of Orion
|
|
| 18.12.2013, 16:22 | |
|
Не по теме: kolorotur, насчет еще проще - это вряд ли. Вот то что доп.код - это инвертированный прямой код плюс единица намного проще для понимания... Добавлено через 2 минуты На вики по-моему кстати неправильно написано. У них ноль знаковый, тогда как ноль знаковый только для действительных чисел, а для целых - он один. Поэтому прямой код единицы - 1, а дополнительный - 1111 1111. Проверка -1 + 1 = 0, 0000 0001 + 1111 1111 = 1| 0000 0000 = 0
0
|
|
| 18.12.2013, 16:26 | |
|
0
|
|
|
Master of Orion
|
|
| 18.12.2013, 16:30 | |
|
kolorotur, так я и говорю - на вики ошибка. Хотя их там много на всевозможные темы, но давать для объяснения ссылку с ошибкой плохо. Там написано, например, что доп. код для 1 это 1, и обратный код для 1 это тоже 1, что полный бред.
Добавлено через 1 минуту kolorotur, число может совпадать со своим дополнительным кодом (например, int.MinValue), но вот с обратным - никогда.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 18.12.2013, 16:31 | ||
|
Единица как в обратном представлении, так и в прямом, будет выглядеть как единица. "Обратное представление" — не значит отрицательное значение. Это значит представление числа в памяти в виде twos-complement.
0
|
||
|
Master of Orion
|
|
| 18.12.2013, 16:32 | |
|
kolorotur, я понял, что они имели ввиду. Но это бред по-моему. Тогда можно говорить, что компьютер использует только числа в доп.коде, т.к. по их представлениям множество положительных прямых, обратных и доп. кодов совпадают.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 18.12.2013, 16:35 | |
|
Ну зачем сразу бред?
Положительные коды — да совпадают, и это хорошо. Всякие обратные, прямые да дополнительные коды придумывают для представления именно отрицательных значений. Потому пусть положительные совпадают, бог с ними. Опять же, "обратный" — не значит инвертированный. Это значит "инвертированный, когда значение отрицательное, а когда положительное — нормальный"
0
|
|
|
1 / 1 / 0
Регистрация: 09.06.2012
Сообщений: 105
|
|
| 18.12.2013, 19:27 [ТС] | |
|
Всем спасибо за ответы, но никто не ответил на вопрос: если верхняя граница short равна 32767, а присваиваем мы число 64000, то переполняется переменная ведь на 64000-32767=31233, так?и следовательно после прибавления к нижней границе получается -32678+31233=-1535, а не 1536. Что я упускаю(сори за тупые, наверное, вопросы)?
0
|
|
|
1 / 1 / 0
Регистрация: 09.06.2012
Сообщений: 105
|
|
| 19.12.2013, 00:25 [ТС] | |
|
Psilon, насчет минимального опечатался, максимальное написал правильно. Так почему?
Добавлено через 3 часа 46 минут Аааа, понял внезапно , нам ведь нужно прибавить сначала единицу , чтобы перейти к нижней границе, и следственно к нижней границе мы прибавляем не 31233, а 31232. Всем спасибо, сори за мои нубские вопросы, только учусь пока что) Всем плюсики) Можно закрывать.
0
|
|
| 19.12.2013, 00:25 | |
|
Помогаю со студенческими работами здесь
18
Необработанное исключение типа "System.FormatException" при приведении типов
Нахождение ошибки в наследовании и приведении типов Куда деваются байты при приведении типов?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|