Maison > Article > développement back-end > Pourquoi Go imprime-t-il les entiers négatifs sous la forme \"-ff\" alors que C imprime \"fffffffffffffff\" lors de l'utilisation de \"%x\" ?
Lors de l'impression d'une valeur entière de -1 à l'aide du spécificateur de format "%x", Go et C se comportent différemment. En Go, la sortie est "-1", tandis qu'en C, elle est "fffffffffffffff", comme prévu.
Le comportement de Go
Go considère le "%x " Spécificateur de format pour représenter la valeur du nombre en notation hexadécimale, qu'il soit négatif ou non. Ainsi, pour -1, la valeur hexadécimale est "-ff".
Comportement de C
En revanche, C imprime les représentations en mémoire d'entiers en utilisant le "%x" spécificateur. Étant donné que -1 est généralement stocké sous la forme du complément à 2, sa représentation hexadécimale en mémoire est "ffffffffffffffff".
Unifier le comportement avec les conversions de types
Pour obtenir un comportement de type C dans Go, il faut explicitement convertir l'entier signé en son équivalent non signé avant d'appliquer le spécificateur de format "%x". Par exemple :
i := -1 // type int fmt.Printf("%x", uint(i)) // prints "fffffffffffffff"
Raison d'être du comportement par défaut de Go
Rob Pike, un développeur Go, explique le raisonnement derrière le comportement par défaut de Go :
" Pourquoi n'est-ce pas le format par défaut [le format non signé] ? Parce que si c'était le cas, il n'y aurait aucun moyen d'imprimer quelque chose sous forme de nombre négatif, ce qui, comme vous pouvez le voir, est une représentation beaucoup plus courte."
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!