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!