Maison > développement back-end > Golang > Pourquoi fmt.Printf affiche-t-il une représentation binaire différente pour les entiers négatifs de celle attendue dans Go ?

Pourquoi fmt.Printf affiche-t-il une représentation binaire différente pour les entiers négatifs de celle attendue dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-02 16:11:02
original
229 Les gens l'ont consulté

Why does fmt.Printf show a different binary representation for negative integers than expected in Go?

Complément à deux et fmt.Printf : résoudre l'énigme de la représentation binaire

Lorsqu'ils travaillent avec des entiers signés, les ordinateurs utilisent le complément à deux pour représenter des valeurs négatives . Cela diffère de la représentation binaire typique, où le signe est indiqué par un bit séparé. Par exemple, dans le complément à deux, l'entier -5 est représenté par 1111 1011.

Cependant, l'impression de la représentation binaire à l'aide de fmt.Printf peut donner des résultats inattendus. Par exemple, l'extrait de code suivant :

var i int8 = -5
fmt.Printf("%b", i)
Copier après la connexion

renvoie étonnamment -101 au lieu de 1111 1011. Cette divergence a conduit à se demander si le complément à deux est réellement utilisé pour la représentation interne ou si le formatage est obscur. la représentation correcte.

Pour faire la lumière sur cette question, nous devons approfondir la façon dont fmt.Printf formate les nombres binaires. Le coupable réside dans la fonction fmt.integer, qui convertit automatiquement les entiers signés négatifs en entiers positifs. Cette conversion implique la négation de l'entier et l'ajout d'un signe - à la chaîne de sortie. Ainsi, la sortie -101 est une représentation de - ajoutée à la représentation binaire de 5.

Pour le démontrer davantage, convertir l'entier signé en un entier non signé, puis le formater à l'aide de fmt.Printf produit les deux corrects. représentation du complément :

var u uint8 = uint(i)
fmt.Printf("%b", u)
Copier après la connexion

Cela produit 11111011, précisément le complément à deux de -5.

Par conséquent, la représentation interne des entiers signés dans Go adhère à la convention du complément à deux. La représentation binaire apparemment incorrecte lors du formatage des entiers signés résulte de la conversion automatique et du pré-signe effectué par fmt.integer. Comprendre ce comportement est essentiel lorsque vous travaillez avec des entiers signés et des représentations binaires dans Go.

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