Maison > développement back-end > Golang > Pourquoi mon code Go rencontre-t-il une erreur de débordement lors de l'utilisation de constantes ?

Pourquoi mon code Go rencontre-t-il une erreur de débordement lors de l'utilisation de constantes ?

Barbara Streisand
Libérer: 2024-11-02 00:42:02
original
740 Les gens l'ont consulté

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

Débordements de constantes en cascade dans Go

Lorsque vous travaillez avec des constantes dans Go, il est important de comprendre leurs conversions de type pour éviter les débordements potentiels. Considérez l'extrait de code suivant :

<code class="go">const (
    userid = 12345
    did = (userid &^ (0xFFFF << 48))
)</code>
Copier après la connexion

La compilation de ce code entraîne l'erreur suivante :

constant -18446462598732840961 overflows int
Copier après la connexion

Pour résoudre ce problème, nous devons approfondir les conversions de type sous-jacentes effectuées par Go. avec des constantes.

Comprendre les constantes non typées et la conversion de type

Dans le code ci-dessus, la constante 0xFFFF << 48 est une constante non typée, ce qui signifie qu’aucun type spécifique ne lui est attribué. Lors de la combinaison de constantes non typées avec des valeurs typées, la constante non typée prend le type de l'autre opérande.

Dans notre cas, nous effectuons une opération ET (&) entre l'ID utilisateur de la constante typée (qui est un int ) et la constante non typée 0xFFFF << 48. Par conséquent, l'expression résultante (userid &^ (0xFFFF << 48)) devient un int.

Débordement de constantes entières

Le problème se pose lorsque nous annuler la constante non typée 0xFFFF << 48, ce qui donne -0xffff000000000001. Étant donné que cette valeur est trop grande pour un type int (qui est signé et a une plage de -2^31 à 2^31-1), elle provoque l'erreur de compilation.

Utilisation d'Int64 pour la portabilité.

Pour éviter ce problème, nous pouvons utiliser un type entier plus grand, tel que int64, qui a une plage plus élevée et peut accepter des valeurs constantes plus grandes.

<code class="go">const (
    userid int64 = 12345
    did = (userid &^ (0xFFFF << 48))
)</code>
Copier après la connexion

Ce changement permet nous pouvons représenter et manipuler des constantes dans les contraintes des types entiers disponibles sans rencontrer de débordements.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal