Delphi 内联更改位读取的答案

Delphi Inline Changes Answer to Bit Reading

我正在使用带有默认编译器选项的 Delphi Berlin。我正在做一些例程,并且遇到内联更改答案的情况。

我的代码:

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,当添加内联时,答案从 False(看起来正确)变为 True。我下面的 table 是:

Button2Click,它只是用变量替换常量,总是产生 False。

我 运行 进行了大量的位检查和设置,发现了这个异常。这就是随机十六进制数在这里的原因。

我在一个更大的项目中也有一个具有相同十六进制数和位 31 的案例,它根据调试或发布产生不同的结果。无法将其简化为合理的示例。

代码看起来正确。我在这里找到了 32 位的类似函数:

Bit Manipulation Using Delphi

所以我的问题是为什么内联词会改变答案?

感谢您的帮助。

你的代码是错误的,因为移位是在 32 位上下文中执行的。一定要这样写

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

强制转换强制 64 位算术。

因此,虽然代码的内联版本与非内联版本的行为不同似乎是错误的,但我怀疑真正的问题是您的代码行为定义不正确。一旦你修改了代码,如上所示,你会发现内联和非内联版本的行为相同,并给出正确答案。