Баг shr

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Баг shr

Сообщение SeZuka » 31.07.2013 11:10:33

Обнаружил следующую странность:
Код: Выделить всё
program Project1;

var
   i: integer;

begin
  i := 55;
  WriteLn(66 shr 32);
  WriteLn(i shr 32);
end.

Результат:
0
55

То есть с константой ведет себя нормально, а с переменной для второго аргумента берется остаток от деления на 32, и соответственно для 32 получаем сдвиг вправо на 0, для 33 на 1 и т.д.
Проверьте у себя.
FPC 2.6.2
Последний раз редактировалось SeZuka 31.07.2013 14:46:35, всего редактировалось 1 раз.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Баг???

Сообщение Vadim » 31.07.2013 11:51:01

SeZuka
Не могу сказать баг это или фича, но в данном случае могу посоветовать ставить после shr тоже переменную.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Баг???

Сообщение Kemet » 31.07.2013 13:56:31

В операциях сдвига x86 в операнде количества сдвигов учитываются только 5-ть младших битов. Поэтому 32 ничего никуда не сдвигает. В остальных случаях - результат зависит от состояния этих самых 5-ти бит.
Что касается константных выражений, насколько я помню(могу ошибаться), в FPC целые константы - 64-х битные.
Потому такие результаты
Последний раз редактировалось Kemet 31.07.2013 14:20:29, всего редактировалось 1 раз.
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: туры в египет

Сообщение ev » 31.07.2013 14:05:17

2 SeZuka
просьба попробовать назвать тему в соответствии с п. 2.3 правил форума
и возможно надо купить новую клавиатуру (чтобы не дублировались символы вопроса)
ev
долгожитель
 
Сообщения: 1775
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Re: Баг shr

Сообщение SeZuka » 31.07.2013 14:53:27

Vadim писал(а):Не могу сказать баг это или фича, но в данном случае могу посоветовать ставить после shr тоже переменную.

Как раз с переменной и обнаружил. Был такой код:
Код: Выделить всё
a := b shr (32 - c);

При c=0 ожидалось что будет a=0, но получилось a=b.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Баг shr

Сообщение zub » 31.07.2013 15:33:22

туры в египет

Было веселой шуткой? или SeZuka технологичный бот ищущий баги в fpc и подмешивающий рекламу в багрепорты? :D
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Баг shr

Сообщение Vadim » 31.07.2013 15:40:49

SeZuka писал(а):a := b shr (32 - c);

Не так...
Лучше так:
Код: Выделить всё
d:=32-c;
a:=b shr d;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Баг shr

Сообщение SeZuka » 31.07.2013 16:02:27

zub писал(а):
туры в египет

Было веселой шуткой? или SeZuka технологичный бот ищущий баги в fpc и подмешивающий рекламу в багрепорты? :D

Это модератор изменил название темы, на такое, первоначальное название "Баг???" его чем-то не устроило, согласен что не сильно информативное, но не писать же целиком сообщение в названии темы.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Баг shr

Сообщение Максим » 02.08.2013 04:24:41

Найти ответ на вопрос о смысле жизни, Вселенной и всего такого можно здесь:
http://bugs.freepascal.org/view.php?id=24815

Чтобы оно вело себя с переменной так, как вы желаете, нужно привести переменную i к типу int64:
Код: Выделить всё
WriteLn(int64(i) shr 32);
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Баг shr

Сообщение SeZuka » 02.08.2013 07:20:48

Максим, спасибо, все стало ясно.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru