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)
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)
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!