2010-09-04 4 views
5

J'ai déclaré une variable uint8 et lorsque la valeur y est imprimée, j'obtiens des visages souriants et des espaces blancs. Ne devrait-il pas afficher des valeurs entières?uint8 affiche des caractères étranges

+1

postez votre code. – tenfour

+0

J'utilise une bibliothèque d'un fournisseur .. il renvoie un type uint8 – aks

+0

Essayez-vous de l'imprimer en tant que chaîne en utilisant le spécificateur de format '% s'? Essayez d'imprimer les caractères individuels à la place. – dirkgently

Répondre

12

Je parie uint8 est un typedef pour unsigned char dans vos en-têtes de système. Alors std::cout << u va imprimer des symboles plutôt que des valeurs entières, où u est de type uint8. Essayez

std::cout << static_cast<int>(u); 

ou

std::cout << +u; 

pour avoir des valeurs numériques imprimées.

+0

mais ne va-t-il pas convertir en int32? – aks

+0

Oui, ce sera le cas. Mais quel est le problème? Cela crée un int temporaire à partir de votre variable uint8 et transmet ce paramètre int à std :: cout pour l'impression. – usta

+0

@Rajesh. Si vous imprimez en décimal, pensez-vous que cela fait une différence si la valeur est stockée dans uint8 ou uint32 juste avant d'être imprimée? –

0

Tout dépend de la façon dont vous imprimez la valeur. Pour cout, essayez cout << (long unsigned int)var;, et pour printf, vous pouvez essayer d'utiliser le spécificateur de format %lu. Cependant, comme usta mentionné, uint8 est probablement défini ou typedef'd comme quelque chose d'autre, car ce n'est pas un type ISO C++. Il y a aussi la possibilité que uint8 soit typedef'd à unsigned long int (générique), ou unsigned __int64 (spécifique à la plate-forme MS), et le compilateur MSVC++ fait juste la mauvaise conversion implicite. Sans savoir ce que uint8 est défini comme, il est difficile de dire.

+0

uint8 est utilisé directement ....> typedef uint8 _UINT1; Dans le commentaire, il est dit 1 octet entier (Comment mettre un bloc gris autour du code?) – aks

+0

Eh bien, alors '_UIN1;' est probablement défini comme quelque chose d'autre aussi. Vous devrez suivre le typedef jusqu'à ce que vous atteigniez le type intrinsèque sous-jacent (bien que, '_UINT1' semble impliquer un seul char non signé, pas un nombre de 64 bits). En outre, vous pouvez spécifier du texte en tant que code (c'est-à-dire la "boîte grise") en l'enveloppant dans des caractères de guillemets. – Javert93

+0

typedef uint8 _UINT1; définit _UINT1 comme alias à uint8, et non l'inverse. Donc vous devrez chercher un typedef XXX uint8; déclaration pour savoir ce que uint8 est. Ou vous pouvez juste me croire que c'est un entier non signé de 8 bits, et est un alias pour char non signé :) [u] Les types intN [_t] signifient toujours des entiers N bits, pas des entiers N octets. – usta

Questions connexes