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 位的类似函数:
所以我的问题是为什么内联词会改变答案?
感谢您的帮助。
你的代码是错误的,因为移位是在 32 位上下文中执行的。一定要这样写
Result := ((UInt64(1) shl ABitIdx) and AQWord)<>0;
强制转换强制 64 位算术。
因此,虽然代码的内联版本与非内联版本的行为不同似乎是错误的,但我怀疑真正的问题是您的代码行为定义不正确。一旦你修改了代码,如上所示,你会发现内联和非内联版本的行为相同,并给出正确答案。
我正在使用带有默认编译器选项的 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 位的类似函数:
所以我的问题是为什么内联词会改变答案?
感谢您的帮助。
你的代码是错误的,因为移位是在 32 位上下文中执行的。一定要这样写
Result := ((UInt64(1) shl ABitIdx) and AQWord)<>0;
强制转换强制 64 位算术。
因此,虽然代码的内联版本与非内联版本的行为不同似乎是错误的,但我怀疑真正的问题是您的代码行为定义不正确。一旦你修改了代码,如上所示,你会发现内联和非内联版本的行为相同,并给出正确答案。