Zitat von
himitsu:
PS: ABS macht intern nichts anderes
Code:
function abs(x: TYP): TYP;
begin
[b]if x < 0 then
result := -x[/b]
else
result := x;
end;
@himitsu:
so ganz stimmt das nicht.
bei mir wird z.B. a:=Abs(a); so umgesetzt
bei Integerwerten
Delphi-Quellcode:
mov eax,[adresse a]
cdq // wenn a negativ dann sind in edx alle Bits=1, sonst alle=0
xor eax,edx
sub eax,edx
mov [adresse a], eax
bei realwerten, z.B. extended
Delphi-Quellcode:
fld tbyte ptr [adresse a]
fabs // setzt das Vorzeichenbit = 0
fstp tbyte ptr [adresses a]
Tja, warum schreibe ich das?!
weil ich gerade gestern das vermeintliche Problem hatte, daß ABS einen negativen Integerwert nicht in einen positiven Wert umwandelte.
Wenn nämlich eine Variable des Typs Integer ihren kleinstmöglichen Wert hat, also -2147483648 oder $8000000 dann gibt es keine korrespondierende positive Zahl und Abs() verändert den Wert nicht, er bleibt also negativ.
Hat ein bischen gedauert, bis ich begriffen hatte wo mein Denkfehler lag.
Bei eingeschalteter Überlaufprüfung gibts dann übrigens eine Fehlermeldung....