Цитата(ТоляМБА @ 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 в частности. Заложенное в язык неявное преобразование числовых типов, конечно, упрощает использование его как обучающего, но приводит, во-первых, к неприятным последствиям вроде обсуждаемого, и, во-вторых, к очень неэффективному результату компиляции всевозможных вычислений. |