Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при умножении чисел, Turbo Pascal, нужна помощь) 
V
    Опции темы
Julius
Дата 10.1.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Уважаемые программисты) нужна ваша помощь. При написании программы столкнулся с проблемой, суть выписал вниз: 

Код

var a, b, c: byte;
n: longint;
begin
writeln(37*41*61);
a:=37;
b:=41;
c:=61;
n:= a*b*c;
writeln(n);
end.


Выводит:
Цитата

92537
27001


т.е. прямо в операторе умножать - хорошо(37*41*61 действительно равно 92537), а переменная записывается с ошибкой. В чем проблема?


UP: по совету приятеля решено заменой типа a,b,c на longint, правда суть ошибки я так и не понял)
UP: после второго поста Фантома понял суть)

Это сообщение отредактировал(а) Julius - 10.1.2010, 19:09
PM MAIL   Вверх
Фантом
Дата 10.1.2010, 14:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 2
Всего: 49



Цитата(Julius @  10.1.2010,  13:29 Найти цитируемый пост)

т.е. прямо в операторе умножать - хорошо(37*41*61 действительно равно 92537), а переменная записывается с ошибкой. В чем проблема? 

В типе переменных a,b,c и в особенностях автоприведения типов у Паскаля. При умножении a*b*c результату "по умолчанию" приписывается тип integer, но реальный результат выходит за пределы возможных значений для этого типа, и в итоге два старших бита отбрасываются. В том же случае, когда Вы умножаете числа прямо в writeln, операндам приписывается тип integer, а не byte.

PM   Вверх
ТоляМБА
Дата 10.1.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: нет
Всего: 252



Цитата(Фантом @  10.1.2010,  16:13 Найти цитируемый пост)
операндам приписывается тип integer
И что? У Integer верхний диапазон 32767, а 92537 как бы побольше будет.

PM   Вверх
Julius
Дата 10.1.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Фантом, спасибо, уже потом увидел ваше сообщение) правда integer тут действительно ни при чем, да и впрочем у меня тип "n" longint а не integer.

Это сообщение отредактировал(а) Julius - 10.1.2010, 14:20
PM MAIL   Вверх
Фантом
Дата 10.1.2010, 15:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 2
Всего: 49



Цитата(ТоляМБА @  10.1.2010,  14:19 Найти цитируемый пост)
И что? У Integer верхний диапазон 32767, а 92537 как бы побольше будет.

Насколько я помню, Turbo Pascal при арифметических операциях допускает возможность выхода за границы типа, увеличивая размер типа результата на "следующий": до integer при работе с byte и до longint при работе с integer. В этом и дело - результаты умножения byte в integer не влезают, а вот результаты уможнения integer в longint помещаются.

Цитата(Julius @  10.1.2010,  14:19 Найти цитируемый пост)
да и впрочем у меня тип "n" longint а не integer.

Это неважно. Сначала результат вычислений в правой части оператора присваивания получает какой-то тип на основе представлений компилятора о преобразовании типов (о которых я писал выше), а уже потом помещается в переменную. Т.е. в этом случае сначала производится умножение с результатом типа integer (причем происходит обрезка результата), а уже потом получившийся неправильный результат типа integer неявно конвертируется в longint при присваивании.

P.S. И, кстати, эта особенность - главная, пожалуй, проблема Паскаля вообще и компилятора TP в частности. Заложенное в язык неявное преобразование числовых типов, конечно, упрощает использование его как обучающего, но приводит, во-первых, к неприятным последствиям вроде обсуждаемого, и, во-вторых, к очень неэффективному результату компиляции всевозможных вычислений. 
PM   Вверх
Julius
Дата 10.1.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



спасибо за информацию) как наберу 100 постов (если наберу 100 постов) ) - поставлю плюс)

M
Rrader
Поставил

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0825 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.