Heim > Artikel > Backend-Entwicklung > Warum tritt in meinem Go-Code bei der Verwendung von Konstanten ein Überlauffehler auf?
Kaskadierende Konstantenüberläufe in Go
Bei der Arbeit mit Konstanten in Go ist es wichtig, deren Typkonvertierungen zu verstehen, um mögliche Überläufe zu vermeiden. Betrachten Sie den folgenden Codeausschnitt:
<code class="go">const ( userid = 12345 did = (userid &^ (0xFFFF << 48)) )</code>
Das Kompilieren dieses Codes führt zu folgendem Fehler:
constant -18446462598732840961 overflows int
Um dieses Problem zu beheben, müssen wir uns mit den zugrunde liegenden Typkonvertierungen befassen, die Go durchführt mit Konstanten.
Untypisierte Konstanten und Typkonvertierung verstehen
Im obigen Code ist die Konstante 0xFFFF << 48 ist eine untypisierte Konstante, was bedeutet, dass ihr kein spezifischer Typ zugewiesen ist. Beim Kombinieren untypisierter Konstanten mit typisierten Werten nimmt die untypisierte Konstante den Typ des anderen Operanden an.
In unserem Fall führen wir eine UND-Verknüpfung (&) zwischen der typisierten konstanten Benutzer-ID (die ein int ist) durch ) und die untypisierte Konstante 0xFFFF << 48. Daher wird der resultierende Ausdruck (Benutzer-ID &^ (0xFFFF << 48)) zu einem int.
Überlaufende Ganzzahlkonstanten
Das Problem entsteht, wenn wir negiere die untypisierte Konstante 0xFFFF << 48, was zu -0xffff000000000001 führt. Da dieser Wert für einen int-Typ (der signiert ist und einen Bereich von -2^31 bis 2^31-1 hat) zu groß ist, verursacht er den Kompilierungsfehler.
Verwendung von Int64 für Portabilität
Um dieses Problem zu vermeiden, können wir einen größeren Ganzzahltyp wie int64 verwenden, der einen größeren Bereich hat und größere konstante Werte aufnehmen kann.
<code class="go">const ( userid int64 = 12345 did = (userid &^ (0xFFFF << 48)) )</code>
Diese Änderung ermöglicht uns, Konstanten innerhalb der Einschränkungen der verfügbaren Integer-Typen darzustellen und zu manipulieren, ohne dass es zu Überläufen kommt.
Das obige ist der detaillierte Inhalt vonWarum tritt in meinem Go-Code bei der Verwendung von Konstanten ein Überlauffehler auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!