Heim  >  Artikel  >  Backend-Entwicklung  >  Warum gibt Golang bei der Berechnung von Konstanten einen Überlauffehler aus?

Warum gibt Golang bei der Berechnung von Konstanten einen Überlauffehler aus?

DDD
DDDOriginal
2024-10-29 19:05:02761Durchsuche

Why Does Golang Throw an Overflow Error When Calculating Constants?

Golangs konstanten Überlauf mit uint64 verstehen

Problem:

Bedenken Sie den folgenden Golang-Code:

<code class="go">userid := 12345
did := (userid & ^(0xFFFF << 48))</code>

Beim Versuch, diesen Code zu kompilieren, ist ein Fehler aufgetreten:

./xxxx.go:511: constant -18446462598732840961 overflows int

Analyse:

Der Kern dieses Problems liegt in der untypisierten Konstante ^(0xFFFF << 48). Aufgrund des Schiebevorgangs stellt diese Konstante einen sehr großen Wert dar. Wenn die untypisierte Konstante aufgrund der bitweisen Operation mit der Benutzer-ID in ein int konvertiert wird, löst der Compiler einen Überlauffehler aus, da die Konstante den Maximalwert überschreitet, der durch ein int dargestellt werden kann.

Lösung:

Um dieses Problem zu lösen, kann man die untypisierte Konstante explizit in einen Typ umwandeln, der ihrer großen Größe gerecht wird. Beispielsweise kann man den problematischen Ausdruck durch Folgendes ersetzen:

<code class="go">did := (userid & (1<<48 - 1))</code>

In diesem modifizierten Ausdruck ergibt 1<<48 - 1 die Konstante 0x0000ffffffffffff, die durch einen int64-Datentyp dargestellt werden kann. Alternativ kann man int64 explizit im Code verwenden, um die Kompatibilität sowohl mit 32-Bit- als auch mit 64-Bit-Architekturen sicherzustellen:

<code class="go">func main() {
  const userID int64 = 12345
  did := userID & (1<<48 - 1)
  println(did)
}</code>

Durch die Einhaltung dieser Vorschläge können Sie ständige Überläufe in Golang effektiv bewältigen und den Code verwalten Portabilität über verschiedene Architekturen hinweg.

Das obige ist der detaillierte Inhalt vonWarum gibt Golang bei der Berechnung von Konstanten einen Überlauffehler aus?. 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