Comprendre les différences d'impression hexadécimale entre Go et C : le cas de -1
En Go, le format %x pour l'impression d'entiers représente le valeur en notation hexadécimale. Ceci est distinct du %x de C, qui imprime la représentation en mémoire d'un entier signé. Cette différence conduit à des résultats inattendus lors de l'impression de l'entier négatif -1.
En Go :
var x uint64 = 1 << 64 - 1 fmt.Printf("%x\n", x)
Sortie :
ffffffffffffffffffff
Ici, %x imprime correctement le représentation hexadécimale de la valeur non signée 1<<64 - 1.
Dans C :
#include <stdio.h> int main() { uint64_t x = 1LL << 64 - 1; printf("%x\n", (long long)x); }
Sortie :
-1
En C, %x imprime la valeur entière signée -1, ce qui semble donner un nombre hexadécimal négatif avec un « - » en tête. Cependant, ce n’est pas le cas ; le signe '-' indique que l'entier est négatif et la valeur hexadécimale ffff...ff est la représentation en complément à 2 de -1.
Go applique un typage strict, nécessitant des conversions de type explicites pour traiter les entiers signés comme non signé. Pour imprimer -1 en tant que valeur non signée dans Go :
i := -1 // type int fmt.Printf("%x", uint(i))
Sortie :
ffffffff
Cette approche convertit l'entier signé -1 en son homologue non signé, ce qui donne la représentation hexadécimale correcte .
Le comportement par défaut de Go pour imprimer des entiers négatifs sous forme de valeurs signées permet une représentation concise, mais cela peut conduire à des résultats inattendus dans contextes hexadécimaux. Comprendre ces différences est crucial pour une écriture de code efficace dans Go.
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!