"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-13
Parcourir:345

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 en utilisant fmt.Printf comme ceci :

var i int8 = -5
fmt.Printf("%b", i)

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

Le problème avec le 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 :

    negative := signedness == signed && a 

Sortie non signée ou signée

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

var u uint8 = uint(i)
fmt.Printf("%b", u)

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 « - ».

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3