Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.035 c
9-1073148390
G A M E R
2004-01-03 19:46
2004.05.16
Зацените мою библиотеку!


14-1082773743
Думкин
2004-04-24 06:29
2004.05.16
С днем рождения! 24 апреля.


1-1083187152
sensor
2004-04-29 01:19
2004.05.16
Popupmenu и ShellExecute


14-1082796579
Undert
2004-04-24 12:49
2004.05.16
http://freesoft.ru/author/add_price.html


14-1083050640
VID
2004-04-27 11:24
2004.05.16
Виртуальная MIDI клавиатура.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский