Maison >développement back-end >Golang >Pourquoi mon Go déborde-t-il constamment lors de l'utilisation d'opérations au niveau du bit ?

Pourquoi mon Go déborde-t-il constamment lors de l'utilisation d'opérations au niveau du bit ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-01 08:55:30185parcourir

Why Does My Go Constant Overflow When Using Bitwise Operations?

Problème avec le débordement constant de Go : résolution des débordements d'int

Dans le domaine de la programmation Go, une question courante se pose : "Pourquoi mon débordement constant lorsque l'ID utilisateur := 12345 et did := (userid &^(0xFFFF << 48))?"

Lors de la compilation d'un tel code, l'erreur redoutée apparaît : "constant -18446462598732840961 overflows int." Mais que se cache-t-il derrière ce message trompeur ?

L'essence du problème

Le coupable derrière ce malheur est la nature non typée de la constante ^(0xFFFF << 48). Go attribue des valeurs colossales aux constantes non typées, dépassant les limites des entiers conventionnels.

0xffff << 48 donne 0xffff000000000000. Inverser son signe à l'aide de l'opérateur de négation au niveau du bit (^) donne -0xffff000000000001.

Maintenant, la variable userid, initialisée avec la valeur 12345, hérite du type int. Lorsque l'opération ET au niveau du bit (&) est effectuée, le compilateur suppose que la constante non typée doit être rétrogradée au type int. Cette hypothèse conduit à un conflit, car l'ampleur de la constante dépasse la valeur maximale admissible pour int.

La solution : apprivoiser les géants non typés

Pour résoudre ce problème, adoptez le pouvoir du casting de caractères. . Si vous aviez l'intention d'attribuer la constante 0x0000ffffffffffff, envisagez d'utiliser 1<<48 - 1. Cette expression, lorsqu'elle est utilisée dans des environnements 64 bits, garantit la compatibilité avec des entiers plus grands.

Pour une véritable portabilité, évitez int en faveur de int64, élargissant la portée de votre code pour s'adapter aux architectures 32 bits et 64 bits.

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