Maison  >  Article  >  développement back-end  >  Pourquoi fmt.Printf affiche-t-il des représentations binaires incorrectes pour les entiers signés dans Go ?

Pourquoi fmt.Printf affiche-t-il des représentations binaires incorrectes pour les entiers signés dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 11:29:29217parcourir

Why Does fmt.Printf Display Incorrect Binary Representations for Signed Integers in Go?

La divergence entre le complément à deux et fmt.Printf

Question originale :

Lorsque vous essayez d'imprimer la représentation binaire de un entier signé, fmt.Printf produit une sortie qui diffère de la valeur attendue du complément à deux.

Analyse :

Le complément à deux est la technique utilisée par les ordinateurs pour représenter en interne les nombres signés. entiers. Par exemple, -5 serait représenté par 1111 1011. Cependant, fmt.Printf, lorsqu'il est utilisé avec un entier signé, produit un résultat inattendu. Cependant, la conversion en un entier non signé donne la représentation binaire correcte.

Explication :

Le comportement observé n'est pas dû à la représentation interne de l'entier. C'est plutôt le résultat de la façon dont fmt.Printf formate les nombres binaires.

La fonction fmt.integer, utilisée par fmt.Printf, convertit les entiers signés négatifs en valeurs positives avant le formatage. Il en résulte que la valeur binaire de la valeur absolue est précédée d'un signe -.

Exemple :

<code class="go">var i int8 = -5
fmt.Printf("%b", i) // Outputs: -101 (Incorrect)</code>

Dans cet exemple, -5 est converti en 5 en binaire, qui est ensuite précédé d'un ., ce qui donne -101.

Résolution :

Pour obtenir la représentation binaire correcte d'un entier signé, on peut convertir convertissez-le en un entier non signé, puis utilisez fmt.Printf pour imprimer la représentation binaire.

<code class="go">var i int8 = -5
var u uint8 = uint8(i)
fmt.Printf("%b", u) // Outputs: 1111 1011 (Correct)</code>

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!

Déclaration:
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