Heim  >  Artikel  >  Backend-Entwicklung  >  Warum tritt in meinem Go-Code bei der Verwendung von Konstanten ein Überlauffehler auf?

Warum tritt in meinem Go-Code bei der Verwendung von Konstanten ein Überlauffehler auf?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 00:42:02625Durchsuche

Why Does My Go Code Experience an Overflow Error When Using Constants?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn