Facendo alcune prove con i messaggi di compilazione (a proposito di un recente post), mi sono trovato di fronte a questo, che dovrebbe essere un palese errore di valutazione:
procedure TForm1.Button1Click(Sender: TObject);
var p: UINT64;
begin
p := $FFFFFFFFFFFFFFFF;
ShowMessage(p.toString);
end;
Codice banale .... se non fosse che il compilatore dà questo warning:
unit1.pas(37,8) Warning: range check error while evaluating constants (-1 must be between 0 and 18446744073709551615)
Il codice invece è valido (almeno secondo me) .... quella costante esadecimale corrisponde al massimo valore assegnabile ad una UINT64 e non al valore -1 (che non è comuqnue ammesso x P).
Corrisponde anche a voi ? Chiedo anche ai veterani del FPC ....
Ciao
in effetti la cosa è strana...
deve essere per forza un warning dato per errore dal compilatore
anche perché questo codice da lo stesso risultato (che è corretto)
però senza warning
procedure TForm1.Button1Click(Sender: TObject);
var p: UINT64;
begin
p := high(UInt64);
ShowMessage(p.toString);
end;
forse è qualcosa di più di un warning dato per errore
forzando il tipo, il warning sparisce
sembrerebbe che la costante sia interpretata come un tipo diverso e che venga fatto il cast dopo aver generato il warn
strano...
procedure TForm1.Button1Click(Sender: TObject);
var p: UINT64;
begin
p := UINT64($FFFFFFFFFFFFFFFF);
ShowMessage(p.toString);
end;
:o :o :o ;D
però così compila senza alcun warning .....
procedure TForm1.Button1Click(Sender: TObject);
var p: UINT64;
begin
p := $FFFFFFFFFFFFFFFF+1;
ShowMessage(p.toString);
end;
Loooool