Я использую 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 ответ изменяется с Ложного (который выглядит правильным) на Истинный, когда добавляется встроенный. Моя таблица ниже:
Button2Click, который просто заменяет константу переменной, всегда выдает False.
Я выполнял большое количество проверок и установок битов и столкнулся с этой аномалией. Вот почему случайное шестнадцатеричное число здесь.
У меня также есть случай с тем же шестнадцатеричным номером и битом 31 в большем проекте, который дает разные результаты, основанные на Debug или Release. Невозможно упростить это до разумного примера.
Код выглядит правильно. Я нашел подобную функцию для 32-битных здесь:
Управление битами с помощью Delphi
Итак, мой вопрос: почему встроенное слово изменит ответ?
Спасибо за любую помощь.