Comprendre le débordement d'entier dans les constantes Go
En programmation Go, tenter d'insérer une valeur excessivement grande dans une constante entière peut conduire à une compilation erreur. Considérez l'extrait de code suivant :
<code class="go">userid := 12345 did := (userid & ^(0xFFFF << 48))</code>
Lors de la compilation de ce code, vous pouvez rencontrer l'erreur suivante :
./xxxx.go:511: constant -18446462598732840961 overflows int
Cette erreur provient de la nature non typée des expressions constantes dans Go.
Constantes non typées et débordement d'entier
Dans le code donné, la constante ^(0xFFFF << 48) a une valeur non typée, ce qui signifie qu'elle peut contenir une valeur arbitrairement grande entier. Cependant, lorsque vous tentez d'effectuer une opération AND au niveau du bit avec l'ID utilisateur entier saisi, le compilateur tente de convertir la constante non typée en un type int. La valeur résultante, -18446462598732840961, dépasse la valeur maximale représentable pour un int, entraînant une erreur de débordement.
Résolution du problème de débordement
Pour éviter cette erreur de débordement, il est essentiel de taper explicitement la constante non typée. Dans ce cas, vous pouvez utiliser le code suivant à la place :
<code class="go">userid := 12345 did := (userid & (uint64(1<<48) - 1))</code>
En convertissant explicitement la constante en uint64 à l'aide de uint64(1<<48) - 1, vous vous assurez que les deux opérandes dans l'opération ET au niveau du bit avoir le même type, éliminant le problème de débordement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!