Problem mit Datentyp UInt64

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Vamogu05
Beiträge: 30
Registriert: Fr 13. Aug 2021, 10:51

Problem mit Datentyp UInt64

Beitrag von Vamogu05 »

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

Benutzeravatar
theo
Beiträge: 11027
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Datentyp UInt64

Beitrag von theo »

Bei mir meldet er keinen Fehler, nur eine Warnung.
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)} 
Soweit ich sehe, funktioniert alles normal.

Welche FPC Version hast du, dass dies einen Fehler gibt?

Benutzeravatar
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

Beitrag von Zvoni »

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

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.

Vamogu05
Beiträge: 30
Registriert: Fr 13. Aug 2021, 10:51

Re: Problem mit Datentyp UInt64

Beitrag von Vamogu05 »

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.

Benutzeravatar
theo
Beiträge: 11027
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Datentyp UInt64

Beitrag von theo »

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).

Vamogu05
Beiträge: 30
Registriert: Fr 13. Aug 2021, 10:51

Re: Problem mit Datentyp UInt64

Beitrag von Vamogu05 »

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.

wp_xyz
Beiträge: 5304
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem mit Datentyp UInt64

Beitrag von wp_xyz »

Vamogu05 hat geschrieben: Mi 15. Okt 2025, 15:09 Bei mir kommt definitiv ein Error in dieser Zeile:
Test: UInt64 = $FFFFFFFFFFFFFFFF;
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).

Benutzeravatar
theo
Beiträge: 11027
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Datentyp UInt64

Beitrag von theo »

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).
Stimmt. Hatte gar nicht mehr auf dem Schirm, dass sich das auch zur compile-time auswirken kann.
For 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.
https://wiki.freepascal.org/$rangeChecks

Vamogu05
Beiträge: 30
Registriert: Fr 13. Aug 2021, 10:51

Re: Problem mit Datentyp UInt64

Beitrag von Vamogu05 »

Ok, danke. Ja, diese Bereichsprüfung habe ich mal eingeschalten.
Danke für den Hinweis. Mit dem Cast funktioniert es jetzt..

Benutzeravatar
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

Beitrag von af0815 »

Vamogu05 hat geschrieben: Mi 15. Okt 2025, 23:30 Mit dem Cast funktioniert es jetzt..
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).

Vamogu05
Beiträge: 30
Registriert: Fr 13. Aug 2021, 10:51

Re: Problem mit Datentyp UInt64

Beitrag von Vamogu05 »

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.

Benutzeravatar
theo
Beiträge: 11027
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Datentyp UInt64

Beitrag von theo »

af0815 hat geschrieben: Do 16. Okt 2025, 10:49 Leider ist der Remark nicht direkt verlinkt.
Ist wohl das gemeint?
$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.
https://wiki.freepascal.org/local_compi ... _versus_$Q

Benutzeravatar
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

Beitrag von af0815 »

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.
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 !

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).

Benutzeravatar
theo
Beiträge: 11027
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Datentyp UInt64

Beitrag von theo »

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.
Für deinen Fall gibt es übrigens noch die vordefinierte Konstante "MaxUIntValue".
Da kannst du dir die ganzen "eFFen" sparen. :wink:

Vamogu05
Beiträge: 30
Registriert: Fr 13. Aug 2021, 10:51

Re: Problem mit Datentyp UInt64

Beitrag von Vamogu05 »

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. :wink:
Gut zu wissen, danke. Die ganzen "eFFen" waren nur zur Veranschaulichung. Ich brauche die Werte um Zobrist-Hashcodes zu berechnen.
Danke an Alle, Ihr habt mir sehr geholfen.

Antworten