Maison > développement back-end > Golang > le corps du texte

Pourquoi fmt.Printf génère-t-il « -101 » lors de l'impression d'une représentation binaire d'un entier signé dans Go ?

Barbara Streisand
Libérer: 2024-11-02 07:28:29
original
347 Les gens l'ont consulté

Why Does fmt.Printf Output

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)
Copier après la connexion

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)
Copier après la connexion

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 &amp;&amp; a < 0
   166      if negative {
   167          a = -a
   168      }
Copier après la connexion

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!

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