Le complément à deux et le résultat déroutant de fmt.Printf
Dans le domaine de l'informatique, le complément à deux est la méthode prédominante utilisée pour représenter entiers signés en interne. Cette représentation consiste à retourner les bits et à en ajouter un pour exprimer des nombres négatifs. Par exemple, dans le complément à deux, -5 serait représenté au format binaire par "1111 1011" (équivalent à ^5 1).
Une perplexité surgit lorsque l'on tente d'imprimer la représentation binaire d'un entier signé à l'aide de fmt.Printf . Considérez l'extrait de code suivant :
var i int8 = -5 fmt.Printf("%b", i)
Il est prévu que ce code génère "1111 1011", la représentation du complément à deux de -5. Cependant, le résultat réel est « -101 », ce qui s'écarte de cette attente. Cela soulève la question : la valeur est-elle stockée en interne au format complément à deux, ou une représentation différente est-elle utilisée ?
Curieusement, la conversion de la valeur en un entier non signé avant de l'imprimer donne le résultat souhaité :
var u uint8 = uint(i) fmt.Printf("%b", u)
Cela donne un résultat de "11111011", la représentation exacte du complément à deux de -5.
Le nœud de l'écart réside dans la façon dont fmt.Printf gère le formatage des nombres binaires. En examinant de plus près la fonction fmt.integer, il devient clair que l'entier signé négatif est converti en un entier positif pendant le processus de formatage :
165 negative := signedness == signed && a < 0 166 if negative { 167 a = -a 168 }
Cette conversion nécessite l'ajout d'un préfixe '-' à la chaîne formatée, ce qui explique la sortie "-101" observée plus tôt.
Essentiellement, la représentation interne de la valeur adhère à la convention du complément à deux, tandis que le processus de formatage dans fmt.integer convertit l'entier signé négatif à sa contrepartie positive, conduisant à un résultat inattendu.
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!