Maison >développement back-end >Golang >Pourquoi l'impression de -1 en hexadécimal en Go et C produit-elle des résultats différents ?

Pourquoi l'impression de -1 en hexadécimal en Go et C produit-elle des résultats différents ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-16 00:58:03257parcourir

Why does printing -1 as hexadecimal in Go and C produce different results?

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!

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