Soner hat geschrieben:@Warf:
Ich glaube du hast die 0 bei Vergleich nicht gesehen, fpc wertet das als Wahr also auch wei bei Delphi -1:
if
0>(w-1) then..
Und wenn du für 0 eine Word Variable nimmt wertet fpc das auch als wahr aus, hat in diesem Fall mit integer nicht zu tun, hier gestet:
Code: Alles auswählen
d,w: Word;
i:integer;
i:=0;
d:=0;
w:=0;
if d>(w-1) then ist_wahr_bei_fpc; //rechte seite wird -1
if d>pred(w-1) then ist_nicht_wahr_bei_fpc; //rechte seite wird 65535
if i>pred(w-1) then ist_nicht_wahr_bei_fpc; //rechte seite wird 65535
d:=(w-1); //bei fpc=65535
Also bei If-Vergleichen wertet fpc Pred und (word0-1) anders aus.
Wie gesagt es kommt auf den Typen an, der Interne arbeitstyp ist Integer bzw Int64, wenn keine Typzuweisung stattfindet, während pred auf dem Typen selbst arbeitet. Das Ergebnis einer Arithmetischen Operation ist auch zunächst ein Integer und wird erst bei der Zuweisung zu einer Variable in den entsprechenden Wert gecastet
Ein kleines Beispiel:
Code: Alles auswählen
var w1, w2: Integer;
begin
WriteLn(SizeOf(w1)); // 2 Byte - Word größe
WriteLn(SizeOf(w1-1)); // 4 Byte - 32 Bit Integer bzw 8, 64 Bit auf 64 Bit system
WriteLn(SizeOf(w1-w2)); // 4 Byte - 32 Bit Integer, 64 Bit auf 64 Bit system
end;
Das liegt daran das das System intern für die Berechnung von Typen diese zunächst in die Nativen Typen (also Integer für 32 Bit System und Int64 für 64 Bit System) castet, dann die Berechnung ausführt, und danach das Ergebnis erst bei der Zuweisung in die entsprechenden Daten gecastet wird. Daher wird auch für QWord das ergebnis High(QWord), für Cardinal das ergebnis High(Cardinal), etc, da es intern ein -1 ist und dann erst bei der Zuweisung gecastet wird.
Ich hoffe das war halbwegs verständlich.
Das ganze wird erst richtig interessant wenn man mit Compileroptimierungen arbeitet, ich weiß zwar nicht wie es beim FPC ist, aber z.B. C verwendet dann Statt der Arithmetischen Operationen (z.B. ADD in Assembler) optimierte Prozessorbefehle (z.B. INC falls eine Zuweisung der Form x=x+1), grade bei CISC Prozessoren gibt es davon viele, und diese verhalten sich auch nochmal anders, und dann kann es richtig spaßig werden rauszufinden welcher Typ zu welchem Zeitpunkt verwendet wird. Darum sollte man sich von diesen Overflows immer fern halten.