Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: 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 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
1-1083583187
SashaNevid
2004-05-03 15:19
2004.05.16
Обращение к Edit ам по индексам?


11-1069790916
=Sniper=
2003-11-25 23:08
2004.05.16
RichEdit1.WordWrap? Это глюк?


3-1082380121
Term
2004-04-19 17:08
2004.05.16
Можно ли в запросе три поля VARCHAR объеденить в одно


1-1083077512
ЧупаЧупс
2004-04-27 18:51
2004.05.16
VcChart


1-1083181409
Yuri2004
2004-04-28 23:43
2004.05.16
Множественное наследование