2010-09-29 8 views
0

En fait, j'ai (probablement) un problème "simple". Donc, je ne sais pas comment transformer un entier signé en un entier non signé.C: Convertir signé à non signé

Mon code:

signed int entry = 0; 
printf("Decimal Number : "); 
scanf("%d", &entry); 
unsigned int uEntry= (unsigned int) entry; 
printf("Unsigned : %d\n", uEntry); 

Si j'envoie la valeur non signée à la console (voir ma dernière ligne de code), je reçois toujours un retour entier signé.

Pouvez-vous m'aider?

Merci beaucoup!

Meilleures salutations, pro

Répondre

9
printf("Unsigned : %u\n", uEntry); 
//     ^^ 

Vous devez utiliser le spécificateur %u pour dire le moteur d'exécution printf que le uEntry est un unsigned int. Si vous utilisez %d la fonction printf s'attendra à int, réinterprétez ainsi votre entrée à une valeur signée.

+0

Salut Kenny, Merci pour votre réponse. Si je définis le spécificateur% u, j'obtiendrai pour -13 une valeur non signée de 4294967283. Quel est le problème? Merci. – bitsmuggler

+0

Il n'y a pas de problème. C'est la représentation non signée des bits de votre variable. –

+2

@pro: Lorsque votre spécificateur de format ne correspond pas au type de la valeur que vous imprimez, le comportement n'est pas défini et les résultats sont dénués de sens. C'est à dire. lorsque vous imprimez '-13' avec'% u', les résultats sont dénués de sens. Ainsi que votre tentative originale d'imprimer une valeur non signée avec '% d'. Utilisez toujours le bon spécificateur de format, si vous voulez que votre sortie ait un sens: '% u' pour' unsigned int', '% d' pour' signed int'. – AnT

1

Ajoutez ces deux lignes à la fin de votre code, et vous comprendrez ce qui se passe.

printf("entry: signed = %d, unsigned = %u, hex = 0x%x\n", entry, entry entry); 
printf("uEntry: signed = %d, unsigned = %u, hex = 0x%x\n", uEntry,uEntry,uEntry); 
+1

Bien qu'il puisse être utile d'expliquer le fonctionnement de votre implémentation particulière, ces deux appels aboutissent à un comportement indéfini. Vous devez fournir les types corrects à 'printf' en fonction de ce que vous avez spécifié dans la chaîne de format afin que les résultats soient bien définis. –

Questions connexes