ich muß zugeben, wir beide rechnen irgendwie wohl nicht so ganz richtig
Delphi-Quellcode:
Function ArithmeticShiftRight(i: Integer; Shift: Byte): Integer;
ASM
MOV CL,
DL
SAR EAX, CL
End;
Function ArithmeticShiftRight2(i: Integer; Shift: Byte): Integer;
Begin
Result := (i
shr Shift)
or (($FFFFFFFF * (i
shr 31))
shl 32 - Shift)
End;
function arithmetic_shr(a: Integer; b: Byte): Integer;
begin
Result := Sign(a) * (abs(a)
shr b);
end;
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
for i := -1024
to 1024
do
Memo1.Lines.Add(Format('
%d: %d %d %d', [i,
ArithmeticShiftRight (i, 11),
ArithmeticShiftRight2(i, 11),
arithmetic_shr (i, 11)
]));
end;
zumindestens rechnen alle etwas anders (auch mal mit "i sar 8" probiert und da sieht es noch schlimmer aus)
[add]
wegen der Operandengröße ... siehe 1. Funktion