Maison  >  Article  >  développement back-end  >  Pourquoi fmt.Printf génère-t-il « -101 » pour un entier signé représenté en complément à deux ?

Pourquoi fmt.Printf génère-t-il « -101 » pour un entier signé représenté en complément à deux ?

DDD
DDDoriginal
2024-11-01 13:31:29208parcourir

Why Does fmt.Printf Output

Complément à deux et sortie binaire fmt.Printf

Lorsque les ordinateurs utilisent le complément à deux pour représenter des entiers signés, une valeur telle que -5 est stockée sous le modèle de bits "1111 1011". Cependant, lorsque vous essayez d'imprimer cette représentation binaire à l'aide de fmt.Printf comme ceci :

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

La sortie affiche de manière inattendue "-101". Pourquoi cela se produit-il et le complément à deux est-il utilisé en interne ?

Le problème du formatage binaire

La différence réside dans la façon dont fmt.Printf gère le formatage binaire. Lors du formatage d'un entier signé négatif, il le convertit en une valeur positive, puis ajoute un signe « - » avant la chaîne formatée.

En examinant le code source de fmt.Printf, nous constatons que fmt.integer convertit un entier signé en une valeur positive avant de le formater :

<code class="go">    negative := signedness == signed && a < 0
    if negative {
        a = -a
    }</code>

Sortie non signée ou signée

Pour démontrer cela, considérez ce code :

<code class="go">var u uint8 = uint(i)
fmt.Printf("%b", u)</code>

Ici, nous convertissons i en un entier non signé avant de l'imprimer. Cette fois, la sortie affiche correctement "11111011", qui est le complément à deux de -5.

Conclusion

Pour imprimer correctement la représentation binaire d'un entier signé en utilisant fmt.Printf, nous devons d'abord le convertir en un entier positif en utilisant un type non signé. Cela garantit que fmt.Printf ne convertit pas automatiquement la valeur en valeur négative et n'ajoute pas un signe « - ».

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