Помощь - Поиск - Пользователи - Календарь
Полная версия: Осторожно, баг!
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
TarasBer
Обнаружил такой прикол.
Турбо Паскаль вообще не знает про существование знакового сдвига (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, как в других версиях - не знаю.
volvo
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
TarasBer
То есть в Д2009 пошли по пути совместимости с багами старых версий.
(чтобы код выполнятся так же)
Жаль.
В других языках для знаковых чисел делается именно знаковый сдвиг, даже для Фри Паскаля, я слышал, был патч, который устранял беззнаковость сдвига.
Фирменный косяк Дельфи (тянется ещё с Турбо Паскаля, то есть косяк ботланда), получается.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.