convertir une chaîne en int signé

Je veux convertir une chaîne en un entier signé. Ce qui suit est l’exigence. J’ai stocké la valeur hexadécimale sous forme de chaîne dans le tampon. Maintenant, je veux convertir cette valeur en int signé.

buf = "fb869e" Convertissez ceci en buf = "fb869e" signé. Donc, o / p devrait être -293218. mais quand j’essaie de convertir en utilisant strtol, je reçois 16483998. Alors, que dois-je faire?

Le nombre hexadécimal 0xfb869e n’est pas négatif. Les fonctions de conversion de nombre intégrées ne le convertiront pas en une valeur négative, car sa valeur est positive.

Ce que vous dites, c’est qu’il s’agit de l’équivalent hexadécimal non signé d’un nombre négatif de complément à 2 bits 24 bits, et que vous voulez ce nombre. Pour y parvenir, convertissez-le en nombre positif, puis utilisez des calculs pour le convertir en équivalent du complément à 2 bits 24 bits:

 char *buf = "fb869e"; long n; n = strtol(buf, NULL, 16); if (n > 0x7fffffL) n -= 0x1000000L; 

D’autres ont suggéré strtol() . Je veux juste mentionner sscanf() comme alternative, par exemple:

 int i; char *buf = "fb869e"; if (sscanf(buf, "%x", &i) == 1) ... 

strtol convertit une chaîne en entier long

La sortie est correcte et ce sera 16483998

Et si vous utilisez atoi, lorsqu’elle est convertie en chaîne en entier, la valeur correcte s’affiche en dehors de la plage de valeurs pouvant être représentées, INT_MAX ou INT_MIN.

pourquoi 0x00fb869e devrait-il être un nombre négatif? vous devriez avoir à fournir la base de votre système de numération, pour pouvoir même dire, si une valeur dans un format est un négatif dans un autre format

 0xfb869e == 0x00fb869e == 16483998 

En tant qu’entier signé, le bit haut doit être défini pour produire un nombre négatif. Le bit haut du nombre donné n’étant pas défini, il doit être positif.

Si vous souhaitez que le numéro soit traité comme un nombre de 24 bits, vous devez append le bit 23 aux bits de poids fort restants. Voici une façon de le faire:

 long n = strtol(...); if (n > 0xffffff) n |= 0xff000000; 

Utilisez strtol qui convertit ssortingng en un entier long .