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!