Complément à deux et fmt.Printf : Démêler l'énigme de la représentation binaire
Lorsque vous travaillez 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)
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 ce sujet, 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 complémentaire :
var u uint8 = uint(i) fmt.Printf("%b", u)
Cela génère 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 au complément à deux convention. 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3