Delphi Inline меняет ответ на чтение битов - PullRequest
0 голосов
/ 12 ноября 2018

Я использую Delphi Berlin с опциями компилятора по умолчанию. Я делаю некоторые битовые процедуры и у меня есть случай, когда inline меняет ответ.

Мой код:

function BitGetFromQWord( const AQWord: UInt64; ABitIdx: UInt64 ): Boolean; //inline;
begin
  Assert( ABitIdx<64 );
  Result := ((1 shl ABitIdx) and AQWord)<>0;
end;

procedure TForm22.Button1Click(Sender: TObject);
begin
  ShowMessage( BoolToStr( BitGetFromQWord( $CBBE02D50FD8262F, 31 ), True ) );
end;

procedure TForm22.Button2Click(Sender: TObject);
var
  x: Integer;
begin
  x := 31;
  ShowMessage( BoolToStr( BitGetFromQWord( $CBBE02D50FD8262F, x ), True ) );
end;

Для Button1Click ответ изменяется с Ложного (который выглядит правильным) на Истинный, когда добавляется встроенный. Моя таблица ниже:

True/False Table

Button2Click, который просто заменяет константу переменной, всегда выдает False.

Я выполнял большое количество проверок и установок битов и столкнулся с этой аномалией. Вот почему случайное шестнадцатеричное число здесь.

У меня также есть случай с тем же шестнадцатеричным номером и битом 31 в большем проекте, который дает разные результаты, основанные на Debug или Release. Невозможно упростить это до разумного примера.

Код выглядит правильно. Я нашел подобную функцию для 32-битных здесь:

Управление битами с помощью Delphi

Итак, мой вопрос: почему встроенное слово изменит ответ?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 12 ноября 2018

Ваш код неверен, потому что битовое смещение выполняется в 32-битном контексте. Вы должны написать это так

Result := ((UInt64(1) shl ABitIdx) and AQWord)<>0;

где приведение приводит к 64-битной арифметике.

Так что, хотя кажется, что встроенная версия кода ведет себя не так, как не встроенная, кажется неправильным, но реальная проблема заключается в том, что поведение вашего кода плохо определено. Как только вы исправите код, как показано выше, вы обнаружите, что встроенные и не встроенные версии ведут себя одинаково и дают правильный ответ.

...