2010-09-25 22 views
4

Je veux convertir une chaîne en un int signé. Voici l'exigence. J'ai stocké la valeur hexadécimale comme une chaîne dans le tampon. Maintenant, je veux convertir cette valeur en int signé.convertir la chaîne en int signé

buf = "fb869e" Convertissez ceci en int int. Donc, o/p devrait être -293218. mais quand j'essaie de convertir en utilisant strtol je reçois 16483998. Alors qu'est-ce que je devrais faire?

+0

Quelle langue? – codaddict

+0

Langage de programmation ??? –

+0

Où avez-vous trouvé que 0xfb869e est -293218? strtol a raison. – vanza

Répondre

0
0xfb869e == 0x00fb869e == 16483998 

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

Si vous voulez que le nombre soit traité comme un nombre de 24 bits, vous devrez tamponner le bit 23 sur les bits supérieurs restants. Voici une façon de le faire:

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

char buf = "fb869e" - Je veux convertir en int signé. Le o/p devrait être -293218. J'ai juste essayé de convertir la chaîne en long int. Mais je ne reçois pas la valeur négative. – ulaganathan

+0

char buf = "fb869e". Je veux convertir ceci en int signé. Donc, o/p devrait être -293218. J'ai juste essayé de convertir la chaîne en long en utilisant strtol. Mais je ne reçois pas les valeurs négatives. Mes valeurs hexadécimales sont les suivantes. J'ai besoin de o/p en int signé. "Programmation C" 80000e de fcc15e 7ffffe 0b778e 80000e de ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe – ulaganathan

+0

@ulganathan: Il y avait un bug dans ma réponse. Utilisez 'if (n> 0x7fffff) ...' à la place. –

0

pourquoi devrait 0x00fb869e être un nombre négatif? vous devriez avoir à fournir la base de votre système numérique, même à être autorisé à dire, que ce soit une valeur dans un format est négatif dans un autre format

+0

char buf = "fb869e". Je veux convertir ceci en int signé. Donc, o/p devrait être -293218. Mes valeurs hexadécimales sont les suivantes. J'ai besoin de o/p en int signé. 80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe – ulaganathan

4

Le nombre hexadécimal 0xfb869e est pas négative. Les fonctions de conversion de nombre intégrées ne le convertissent pas en valeur négative, puisque sa valeur est positive. Ce que vous dites, c'est que c'est l'équivalent hexadécimal non signé d'un nombre négatif de 2 bits de 24 bits, et vous voulez ce nombre. La manière d'obtenir qui est de le convertir au nombre positif, puis utilisez les calculs pour le convertir à l'équivalent de complément à 2 24 bits:

char *buf = "fb869e"; 
long n; 

n = strtol(buf, NULL, 16); 
if (n > 0x7fffffL) 
    n -= 0x1000000L; 
+0

merci beaucoup .... Cette chose foiré moi 3 dernières heures ... Encore une fois merci beaucoup pour votre aide .... – ulaganathan

1

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

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

Merci pour votre réponse ...... – ulaganathan

0

Utilisez strtol qui convertit string à un nombre entier long.