Maison >développement back-end >Golang >Pourquoi Go génère-t-il une erreur de débordement lors de l'utilisation de constantes non typées dans des opérations au niveau du bit ?

Pourquoi Go génère-t-il une erreur de débordement lors de l'utilisation de constantes non typées dans des opérations au niveau du bit ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 13:38:02786parcourir

Why Does Go Throw an Overflow Error When Using Untyped Constants in Bitwise Operations?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn