J'ai un problème étrange à propos du travail avec des entiers en C ++.
J'ai écrit un programme simple qui définit une valeur sur une variable puis l'imprime, mais il ne fonctionne pas comme prévu.
Mon programme ne comporte que deux lignes de code:
uint8_t aa = 5;
cout << "value is " << aa << endl;
La sortie de ce programme est value is
Ie, il imprime en blanc pour aa
.
Quand je change uint8_t
au uint16_t
code ci - dessus fonctionne comme un charme.
J'utilise Ubuntu 12.04 (Precise Pangolin), 64 bits, et ma version de compilateur est:
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
Réponses:
Il n'imprime pas vraiment un blanc, mais très probablement le caractère ASCII avec la valeur 5, qui est non imprimable (ou invisible). Il existe un certain nombre de codes de caractères ASCII invisibles , la plupart inférieurs à la valeur 32, qui est en fait le blanc.
Vous devez convertir
aa
enunsigned int
pour afficher la valeur numérique, carostream& operator<<(ostream&, unsigned char)
essaie de générer la valeur du caractère visible.la source
int
. Un casting est une façon de faire cela, mais pas la seule.+aa
fonctionne également.int(var)
et que vous(int)var
avez exactement la même signification.int(var)
est déconseillé exactement dans les cas où(int)var
est, pour exactement les mêmes raisons, car cela signifie exactement la même chose. (Je peux comprendre pourquoi vous iriez ici de toute façon, donc je ne dis pas que vous devez utiliserstatic_cast
. Je pense juste que la piste des commentaires ici a été un peu déroutante inutilement.)uint8_t
sera probablement untypedef
pourunsigned char
. Laostream
classe a une surcharge spéciale pourunsigned char
, c'est-à-dire qu'elle imprime le caractère avec le numéro 5, qui n'est pas imprimable, d'où l'espace vide.la source
L'ajout d'un opérateur unaire + avant la variable de tout type de données primitif donnera une valeur numérique imprimable au lieu du caractère ASCII (dans le cas de type char).
la source
uint8_t
commeunsigned char
quelles seraient des valeurs numériques?uint8_t
est juste un type def deunsigned char
,unsigned char
lui-même est géré parostream
likechar
et imprime sa valeur ASCII.unsigned char
qui explique beaucoup de choses. Donc, le seul entier estint
, non?short int
qui prend 2 octets. Il existe également quelques autres variantes du type entier.long
ouint
parce que le compilateur optimiserait l'utilisation de la RAM ou du flash d'après ce qui remplit ce registre, ai-je raison?C'est parce que l'opérateur de sortie traite
uint8_t
comme achar
(uint8_t
est généralement juste un alias pourunsigned char
), donc il imprime le caractère avec le code ASCII (qui est le système de codage de caractères le plus courant)5
.Voir par exemple cette référence .
la source
signed
etunsigned
(au-delà de plainchar
qui en C ++ est en réalité un troisième type distinct). Donc, siuint8_t
est un alias pourunsigned char
(très probablement), c'est ce qui sera utilisé.Utilisation d' ADL (recherche de nom dépendante de l'argument):
production:
Un manipulateur de flux personnalisé serait également possible.
cout << +i << endl
).la source
return std::is_signed<char>::value ? os << static_cast<int>(c) : os << static_cast<unsigned int>(c);
cout
traiteaa
comme unechar
valeur ASCII5
qui est un caractère non imprimable, essayez le typageint
avant d'imprimer.la source
La
operator<<()
surcharge entreistream
etchar
est une fonction non membre. Vous pouvez explicitement utiliser la fonction membre pour traiter achar
(ou auint8_t
) comme unint
.Production:
la source
Comme d'autres l'ont déjà dit, le problème se produit car le flux standard traite les caractères signés et non signés comme des caractères uniques et non comme des nombres.
Voici ma solution avec des changements de code minimes:
L'ajout
"+0"
est sécurisé avec n'importe quel nombre, y compris la virgule flottante.Pour les types entiers, le type de résultat sera remplacé par
int
ifsizeof(aa) < sizeof(int)
. Et cela ne changera pas de type sisizeof(aa) >= sizeof(int)
.Cette solution est également bonne pour se préparer
int8_t
à être imprimé en streaming alors que certaines autres solutions ne sont pas si bonnes:Production:
PS La solution avec ADL donnée par pepper_chico et πάντα ῥεῖ est vraiment belle.
la source