IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Осторожно, баг!, некорректность битового сдвига в Дельфи 7
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Обнаружил такой прикол.
Турбо Паскаль вообще не знает про существование знакового сдвига (sar), даже для знаковых переменных. Но он про него не знал и в отладчике и при вычислении констант, всё было относительно честно.
В Дельфи 7, однако же, всё намного хитрее.

Итак, пишем такую программу:

var
i: integer;
begin
i := -7;
i := i shr 1;
i := (-7) shr 1;
end.



Открываем отладчик и загоняем в него выражения:
Код

(-7) shr 1
i
i shr 1


Оптимизацию отрубаем, чтобы строчки не сожрались.

Насчёт остальных опций - вроде все комбинации дают один результат.

После выполнения 1й строки (i := -7) в отладчике видим, что (-7) shr 1 равно -4, и i shr 1 тоже равно -4.
После выполнения 2й строки (i := i shr 1) в отладчике видим, что i стало равно... 2147483644!!!
После выполнения 3й строки (i := (-7) shr 1) i становится равно -4.

То есть при вычислении констант, а также при вычислении выражений в отладчике Дельфи таки вспоминает про знаковый сдвиг sar (который при сдвиге вправо копирует старший бит, очень удобная команда для эмуляции деления на степени двойки по правилам математики).
Но при компиляции этой команды в код Дельфи забывает про знак переменной!

Баг из Д7, как в других версиях - не знаю.

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






D2009:
после выполнения первой строки:
(-7) shr 1 => 2147483644
i => -7
i shr 1 => 2147483644

после второй строки:
(-7) shr 1 => 2147483644
i => 2147483644
i shr 1 => 1073741822

после третьей:
(-7) shr 1 => 2147483644
i => 2147483644
i shr 1 => 1073741822
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


То есть в Д2009 пошли по пути совместимости с багами старых версий.
(чтобы код выполнятся так же)
Жаль.
В других языках для знаковых чисел делается именно знаковый сдвиг, даже для Фри Паскаля, я слышал, был патч, который устранял беззнаковость сдвига.
Фирменный косяк Дельфи (тянется ещё с Турбо Паскаля, то есть косяк ботланда), получается.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.12.2024 1:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name