Вниз
Скачать: CL | DM;

Ничего не понимаю   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.023 c
6-1080234424
rezya
2004-03-25 20:07
2004.05.16
Проблема с неблокирующими сокетами.


6-1080475939
iudjen
2004-03-28 16:12
2004.05.16
как скачать файл с интернета


4-1080281876
AntiKiller
2004-03-26 09:17
2004.05.16
Почему не работает writeConsoleInput


3-1082221283
CyBeR
2004-04-17 21:01
2004.05.16
Как создать список просмотра DbGrid????


1-1083169178
Svetka*
2004-04-28 20:19
2004.05.16
??????????




   Наверх