Problem mit Datentyp UInt64
Problem mit Datentyp UInt64
Hallo Lazarus Spezialisten,
ich hoffe, jemand kann mir bei folgendem Problem helfen:
Ich definiere eine Konstante und initialisiere sie mit einem Hexadezimalwert.
const Value: UInt64 = $FFFFFFFFFFFFFFFF;
Der Compiler meldet einen Fehler: Range check error while evaluating constants (-1 must be between 0 and 18446744073709551615).
Gebe ich die Zahl als Dezimalzahl ein, wird anstandslos kompiliert.
Ich habe aber über 700 Hexadezimalzahlen aus einem ähnlichen Delphi-Projekt in mein Lazarus-Projekt eingefügt und kann es nun nicht kompilieren. Über 700 Zahlen möchte ich jetzt auch nicht händisch ins Dezimalformal umrechnen und in den Code aufnehmen.
Kennt jemand eine Möglichkeit das Problem zu lösen?
LG
Hannes
ich hoffe, jemand kann mir bei folgendem Problem helfen:
Ich definiere eine Konstante und initialisiere sie mit einem Hexadezimalwert.
const Value: UInt64 = $FFFFFFFFFFFFFFFF;
Der Compiler meldet einen Fehler: Range check error while evaluating constants (-1 must be between 0 and 18446744073709551615).
Gebe ich die Zahl als Dezimalzahl ein, wird anstandslos kompiliert.
Ich habe aber über 700 Hexadezimalzahlen aus einem ähnlichen Delphi-Projekt in mein Lazarus-Projekt eingefügt und kann es nun nicht kompilieren. Über 700 Zahlen möchte ich jetzt auch nicht händisch ins Dezimalformal umrechnen und in den Code aufnehmen.
Kennt jemand eine Möglichkeit das Problem zu lösen?
LG
Hannes
Re: Problem mit Datentyp UInt64
Bei mir meldet er keinen Fehler, nur eine Warnung.
Die kann man ausschalten mit:
Soweit ich sehe, funktioniert alles normal.
Welche FPC Version hast du, dass dies einen Fehler gibt?
Die kann man ausschalten mit:
Code: Alles auswählen
{$WARN 4110 off : range check error while evaluating constants ($1 must be between $2 and $3)}
Welche FPC Version hast du, dass dies einen Fehler gibt?
- Zvoni
- Beiträge: 457
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: Problem mit Datentyp UInt64
Also bei mir kommt eine WARNUNG, kein FEHLER
Rest siehe theos Antwort
Zum grundlegenden Thema:
hab das hier gefunden:
https://forum.lazarus.freepascal.org/in ... ic=42508.0
Ursache: Eine Hex-literal wird (anscheinend?) grundsätzlich als "signed" betrachtet
Workaround: TypeCast in der Const
Rest siehe theos Antwort
Zum grundlegenden Thema:
hab das hier gefunden:
https://forum.lazarus.freepascal.org/in ... ic=42508.0
Ursache: Eine Hex-literal wird (anscheinend?) grundsätzlich als "signed" betrachtet
Workaround: TypeCast in der Const
Code: Alles auswählen
Const
u:Uint64=Uint64($FFFFFFFFFFFFFFFF); //Keine Warnung
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Re: Problem mit Datentyp UInt64
Ich habe diese Version:
Lazarus 4.2 (rev lazarus_4_2) FPC 3.2.2 aarch64-darwin-cocoa
Muss dann an einer Einstellung des FPC liegen.
Lazarus 4.2 (rev lazarus_4_2) FPC 3.2.2 aarch64-darwin-cocoa
Muss dann an einer Einstellung des FPC liegen.
Re: Problem mit Datentyp UInt64
Ich habe die gleiche FPC Version, bin aber auf x86_64-linux-qt6.
Ich kann mir nicht vorstellen, dass aus einer gleichlautenden Warnung ein Fehler wird, nur aufgrund einer anderen Plattform.
Bist du sicher, dass es nicht woanders hängt?
Hast du einen der Tipps oben ausprobiert? (Typecast, WARN off).
Ich kann mir nicht vorstellen, dass aus einer gleichlautenden Warnung ein Fehler wird, nur aufgrund einer anderen Plattform.
Bist du sicher, dass es nicht woanders hängt?
Hast du einen der Tipps oben ausprobiert? (Typecast, WARN off).
Re: Problem mit Datentyp UInt64
Bei mir kommt definitiv ein Error in dieser Zeile:
Test: UInt64 = $FFFFFFFFFFFFFFFF;
Mit einem Typecast funktioniert es:
Test: UInt64 = UInt64($FFFFFFFFFFFFFFFF);
Gut, dann werde ich alle Einträge casten. Das sollte mit suchen/ersetzen machbar sein.
Danke, für den wertvollen Tipp.
Test: UInt64 = $FFFFFFFFFFFFFFFF;
Mit einem Typecast funktioniert es:
Test: UInt64 = UInt64($FFFFFFFFFFFFFFFF);
Gut, dann werde ich alle Einträge casten. Das sollte mit suchen/ersetzen machbar sein.
Danke, für den wertvollen Tipp.
Re: Problem mit Datentyp UInt64
Falls du in den Compiler-Optionen die Bereichsprüfung (-Cr) aktiviert hast, soll das auch so sein ("Projekt" > "Projekteinstellungen" > "Compilereinstellungen" > "Debuggen" > "Überprüfungen" > Häkchen vor "Bereich (-Cr)"; Häkchen weg, und der Fehler wird zur Warnung).Vamogu05 hat geschrieben: Mi 15. Okt 2025, 15:09 Bei mir kommt definitiv ein Error in dieser Zeile:
Test: UInt64 = $FFFFFFFFFFFFFFFF;
Re: Problem mit Datentyp UInt64
Stimmt. Hatte gar nicht mehr auf dem Schirm, dass sich das auch zur compile-time auswirken kann.wp_xyz hat geschrieben: Mi 15. Okt 2025, 18:54 Falls du in den Compiler-Optionen die Bereichsprüfung (-Cr) aktiviert hast, soll das auch so sein ("Projekt" > "Projekteinstellungen" > "Compilereinstellungen" > "Debuggen" > "Überprüfungen" > Häkchen vor "Bereich (-Cr)"; Häkchen weg, und der Fehler wird zur Warnung).
https://wiki.freepascal.org/$rangeChecksFor assignments involving constant expressions a range check is performed already at compile-time, but is either a warning or error depending on the current setting.
Re: Problem mit Datentyp UInt64
Ok, danke. Ja, diese Bereichsprüfung habe ich mal eingeschalten.
Danke für den Hinweis. Mit dem Cast funktioniert es jetzt..
Danke für den Hinweis. Mit dem Cast funktioniert es jetzt..
- af0815
- Lazarusforum e. V.
- Beiträge: 6977
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Problem mit Datentyp UInt64
Das ist die sichere Methode, einfach die Prüfung abzuschalten ist für mich keine wirklich gute Arbeitsweise. Wenn es nötig sein sollte, so sollte man sich sein Konzept gut überlegen und wenn, es gezielt nur für den Bereich deaktivieren, von dem man weis, warum man es deaktiviert hat ! Mit dem Cast, sagst du dem Compiler, was du wirklich haben willst. So kann er ja auf die Idee kommen das die Zahl eine Vorzeichenbehaftete 64 Bit Zahl ist, die er dann natürlich nicht in eine Vorzeichenlose 64 Bitzahl hineinbekommt.
Siehe https://www.freepascal.org/docs-html/prog/progsu65.html
Dort ist der letzte Satz interessant
Remark See the note on expression evaluation on 64-bit systems and the consequences for range checking and overflow checking.
Leider ist der Remark nicht direkt verlinkt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Problem mit Datentyp UInt64
Danke, sehr interessant.
In Delphi hat das anstandslos funktioniert. Ich denke, mit dem Cast ist das eine saubere Lösung. Die Bereichsprüfung möchte ich eingeschalten haben.
In Delphi hat das anstandslos funktioniert. Ich denke, mit dem Cast ist das eine saubere Lösung. Die Bereichsprüfung möchte ich eingeschalten haben.
Re: Problem mit Datentyp UInt64
Ist wohl das gemeint?
https://wiki.freepascal.org/local_compi ... _versus_$Q$R versus $Q
There is the completely artificial distinction between the meaning of "overflow" and "range check" errors as defined by Borland. They are basically exactly the same error, except that one is detected by checking the overflow flag of the CPU and the other by explicitly comparing ranges.
On 64 bit CPUs, integer arithmetic is performed using 64 bit integers because of Pascal's convention to evaluate expressions using the native signed integer type. As a result, overflows cannot occur there when performing 32 bit arithmetic and you will get a range error instead when assigning the result to a 32 bit variable. Ideally, there would be only a single switch that governs both range/overflow checking, but because of historical reasons (as explained above) there are two.
- af0815
- Lazarusforum e. V.
- Beiträge: 6977
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Problem mit Datentyp UInt64
Was in Delphi funktioniert, hängt auch ein wenig von den verwendeten Optionen ab und wenn man standardmässig nicht alle Checks enabled hat, so kann es zu solchen Erscheinungen kommen. Und Delphi ist nicht Lazarus/FPC !Vamogu05 hat geschrieben: Do 16. Okt 2025, 11:14 Danke, sehr interessant.
In Delphi hat das anstandslos funktioniert. Ich denke, mit dem Cast ist das eine saubere Lösung. Die Bereichsprüfung möchte ich eingeschalten haben.
Lazarus/FPC können verschiedene Modies
https://www.freepascal.org/docs-html/pr ... gse62.html
Ich nehme oft $MODE OBJFPC, das ist gefühlt strenger als der Delphi-Modus.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Problem mit Datentyp UInt64
Für deinen Fall gibt es übrigens noch die vordefinierte Konstante "MaxUIntValue".Vamogu05 hat geschrieben: Do 16. Okt 2025, 11:14 Danke, sehr interessant.
In Delphi hat das anstandslos funktioniert. Ich denke, mit dem Cast ist das eine saubere Lösung. Die Bereichsprüfung möchte ich eingeschalten haben.
Da kannst du dir die ganzen "eFFen" sparen.

Re: Problem mit Datentyp UInt64
Gut zu wissen, danke. Die ganzen "eFFen" waren nur zur Veranschaulichung. Ich brauche die Werte um Zobrist-Hashcodes zu berechnen.theo hat geschrieben: Do 16. Okt 2025, 11:44 Für deinen Fall gibt es übrigens noch die vordefinierte Konstante "MaxUIntValue".
Da kannst du dir die ganzen "eFFen" sparen.![]()
Danke an Alle, Ihr habt mir sehr geholfen.