![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Обнаружил такой прикол.
Турбо Паскаль вообще не знает про существование знакового сдвига (sar), даже для знаковых переменных. Но он про него не знал и в отладчике и при вычислении констант, всё было относительно честно. В Дельфи 7, однако же, всё намного хитрее. Итак, пишем такую программу:
Открываем отладчик и загоняем в него выражения: Код (-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 - 19.01.2011 15:58 -------------------- |
![]() ![]() |
volvo |
![]()
Сообщение
#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 |
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 23:17 |