![]() |
Модераторы: volvo877, Snowy, MetalFan |
![]() ![]() ![]() |
|
Julius |
|
||||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
Уважаемые программисты) нужна ваша помощь. При написании программы столкнулся с проблемой, суть выписал вниз:
Выводит:
т.е. прямо в операторе умножать - хорошо(37*41*61 действительно равно 92537), а переменная записывается с ошибкой. В чем проблема? UP: по совету приятеля решено заменой типа a,b,c на longint, правда суть ошибки я так и не понял) UP: после второго поста Фантома понял суть) Это сообщение отредактировал(а) Julius - 10.1.2010, 19:09 |
||||
|
|||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 2 Всего: 49 |
В типе переменных a,b,c и в особенностях автоприведения типов у Паскаля. При умножении a*b*c результату "по умолчанию" приписывается тип integer, но реальный результат выходит за пределы возможных значений для этого типа, и в итоге два старших бита отбрасываются. В том же случае, когда Вы умножаете числа прямо в writeln, операндам приписывается тип integer, а не byte. |
|||
|
||||
ТоляМБА |
|
|||
![]() Котэ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1607 Регистрация: 15.12.2004 Репутация: нет Всего: 252 |
||||
|
||||
Julius |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
Фантом, спасибо, уже потом увидел ваше сообщение) правда integer тут действительно ни при чем, да и впрочем у меня тип "n" longint а не integer.
Это сообщение отредактировал(а) Julius - 10.1.2010, 14:20 |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 2 Всего: 49 |
Насколько я помню, Turbo Pascal при арифметических операциях допускает возможность выхода за границы типа, увеличивая размер типа результата на "следующий": до integer при работе с byte и до longint при работе с integer. В этом и дело - результаты умножения byte в integer не влезают, а вот результаты уможнения integer в longint помещаются. Это неважно. Сначала результат вычислений в правой части оператора присваивания получает какой-то тип на основе представлений компилятора о преобразовании типов (о которых я писал выше), а уже потом помещается в переменную. Т.е. в этом случае сначала производится умножение с результатом типа integer (причем происходит обрезка результата), а уже потом получившийся неправильный результат типа integer неявно конвертируется в longint при присваивании. P.S. И, кстати, эта особенность - главная, пожалуй, проблема Паскаля вообще и компилятора TP в частности. Заложенное в язык неявное преобразование числовых типов, конечно, упрощает использование его как обучающего, но приводит, во-первых, к неприятным последствиям вроде обсуждаемого, и, во-вторых, к очень неэффективному результату компиляции всевозможных вычислений. |
|||
|
||||
Julius |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
спасибо за информацию) как наберу 100 постов (если наберу 100 постов) ) - поставлю плюс)
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi" | |
|
Запрещается! 1. Обсуждать и делится взломанными компонентами или программным обеспечением 2. Публиковать ссылки на варез 3. Оффтопить
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |