Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизНичего не понимаю Найти похожие ветки
← →
Piter © (2004-04-24 17:50) [0]Почему 18 ?!
var
A, B, I: ShortInt;
C: Integer;
begin
A := 100;
B := 100;
C := 1;
for I := 0 to (A * B) do
Inc(C);
ShowMessage(IntToStr(C));
end;
← →
Rouse_ © (2004-04-24 17:51) [1]Хороший прикол, правда? :)
Просто посмотри отладчик, и все станет ясно...
← →
Piter © (2004-04-24 17:51) [2]отличный прикол... сча посмотрю...
← →
Юрий Зотов © (2004-04-24 18:01) [3]Еще одна иллюстрация на тему о пользе включения опции Overflow checking на этапе отладки программы.
← →
Verg © (2004-04-24 18:25) [4]
> A := 100;
> B := 100;
Поставь вместо 100 - 12 (двенадцать) - еще больше удивишься....
← →
Anatoly Podgoretsky © (2004-04-24 18:27) [5]И не использовать такие типы, нет никаких оснований для этого. Хотя проверка все равно нужна.
← →
Piter © (2004-04-24 18:32) [6]Юрий Зотов (24.04.04 18:01) [3]
Еще одна иллюстрация на тему о пользе включения опции Overflow checking
а это здесь причем?
← →
Anatoly Podgoretsky © (2004-04-24 18:35) [7]А ты включи и поймешь и range checking тоже.
← →
Piter © (2004-04-24 18:40) [8]Anatoly Podgoretsky (24.04.04 18:35) [7]
range checking тоже
ну это я понимаю. А от Overflow checking толку нету.
Блин! Я так и не догнал в дебагере что к чему. Там вообще непонятно.Происходит два inc"а, потом переход, опять два inc"а и опять переход. Не понимаю вообще почему он из цикла выходит! Совсем не понимаю...
← →
Юрий Зотов © (2004-04-24 18:45) [9]> Piter © (24.04.04 18:32) [6]
> а это здесь причем?
При выключенной опции - программа, вроде бы, работает и никаких ошибок не выдает. Но работает она на самом деле неверно - и ошибку может быть не только трудно найти, ее еще надо вообще заметить.
При включенной опции - мгновенно получаем сообщение об ошибке, ее точную причину и место возникновения. Не затратив для этого абсолютно никаких усилий.
Только я немного оговорился - в данном случае имелась в виду опция Range checking. Хотя и к Overflow checking относится то же самое - так что на этапе отладки полезно держать включенными обе опции (а иногда, вероятно, и не только на этапе отладки).
← →
Verg © (2004-04-24 18:45) [10]Блин - shortint - это числа, заниающие один байт (октет, 8 бит) со знаком. Т.е. в диапазоне от -128 до 127.
Прикинь, при перемножении 100 на 100 что получается?
10000 по модулю восьми бит, да еще бывает, что в знаковый бит "стрельнет", вот и получается полная фигня.
short - в С и shortint в Паскале (дельфи) - это две большие разницы
C Паскаль
----------------
short - smallint
char - shortint
← →
Piter © (2004-04-24 19:00) [11]Ну меня переклинило. Не туда смотрел, а надо было смотреть на то, что в циклах FOR значения счетчика уменьшаются, а не увеличиваются. То есть, сначала ему пытаются присвоить A * B, вот тут и происходит выход за границы. Да, интересный пример :)
Юрий Зотов (24.04.04 18:45) [9]
Только я немного оговорился - в данном случае имелась в виду опция Range checking
вот и я про тоже говорил. Overflow checking здесь не при чем
← →
Юрий Зотов © (2004-04-24 19:15) [12]> Piter © (24.04.04 19:00) [11]
> надо было смотреть на то, что в циклах FOR значения счетчика
> уменьшаются, а не увеличиваются. То есть, сначала ему пытаются
> присвоить A * B, вот тут и происходит выход за границы.
Дело не в этом. Отключите оптимизацию - счетчик будет увеличиваться, а его первоначальное значение будет ноль. Но в результате получится все равно то же самое.
← →
Piter © (2004-04-24 19:25) [13]Юрий Зотов (24.04.04 19:15) [12]
неправда ваша. Счетчик уменьшается, ибо зачем тогда применять jnz?
← →
Юрий Зотов © (2004-04-24 20:07) [14]> Piter © (24.04.04 19:25) [13]
Чтобы проверить флаг нуля после выполнения предыдущей команды. От нее и зависит, чья правда, чья неправда.
← →
Piter © (2004-04-24 20:41) [15]Ну. А предыдущая команда уменьшает счетчик
← →
SergP © (2004-04-24 20:57) [16]>Piter © (24.04.04 17:50)
>Почему 18 ?!
А почему бы и нет?
А ты чего ждал?
попробуй
...
var
a, b, c :shortint;
begin
b := 100;
c := 100;
a := b * c;
ShowMessage(IntToStr(a));
...
и увидишь что будет 16
В твоем примере так как счетчик shortint (1 байт), то либо при сравнении (при отключеной оптимизации), либо при начальном присвоении (при включеной) скорее всего происходит работа с младшим байтом от a * b.
Дебагером я это не смотрел. мне лень. Но имхо где-то так все и происходит.
← →
Юрий Зотов © (2004-04-24 21:12) [17]> Piter © (24.04.04 20:41) [15]
Значит, Вы правы. Но только в данном конкретном случае - потому что при другом исходном коде компилятор запросто может построить и другой машинный код. Например, замените (A*B) константой.
← →
Piter © (2004-04-24 22:30) [18]>Например, замените (A*B) константой
ну так вы же сами понимаете, что тогда компилятор будет ругаться...
← →
Юрий Зотов © (2004-04-24 22:36) [19]> Piter © (24.04.04 22:30) [18]
Почему? Просто напишите for i := 0 to 5 и посмотрите, как изменится ассемблерный код.
← →
Piter © (2004-04-24 23:00) [20]а-а-а, вы про это. Ну да, cmp появилось
← →
Undert © (2004-04-24 23:23) [21]
> Piter ©
:)) Ну ты сглючил млин :)
← →
Юрий Зотов © (2004-04-24 23:25) [22]> Piter © (24.04.04 23:00) [20]
Причем не просто cmp, а cmp с 6. Счетчик начал инкрементироваться.
← →
Piter © (2004-04-24 23:53) [23]Undert (24.04.04 23:23) [21]
:)) Ну ты сглючил млин :)
ты про что?
Юрий Зотов (24.04.04 23:25) [22]
:)) Ну ты сглючил млин :)
кстати, интересно - почему Дельфи по разному строит код? Вроде оптимизация отключена - значит, цикл FOR должен иметь одно построение
← →
vertal (2004-04-25 00:43) [24]BP и Delphi при вычислениях проводят их в пределах старшего типа , который есть в выражении , даже если результат потом присваивается более емкому типу .Поэтому при опасности его переполнения (типа , старшего в вычисляемом выражении) следует писать , например
Integer(A)*B
- так по-моему должно работать
← →
Piter © (2004-04-25 18:12) [25]кстати, интересно - почему Дельфи по разному строит код? Вроде оптимизация отключена - значит, цикл FOR должен иметь одно построение
← →
Undert © (2004-04-25 21:30) [26]Piter ©
про сабж этой ветки.
← →
Piter © (2004-04-26 19:10) [27]никто не знает?
"почему Дельфи по разному строит код? Вроде оптимизация отключена - значит, цикл FOR должен иметь одно построение"
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.033 c