194 votes

uint8_t ne peut pas être imprimé avec cout

J'ai un problème étrange concernant le travail avec des entiers en c++.

J'ai écrit un programme simple qui définit une valeur dans une variable et l'imprime ensuite, mais cela ne fonctionne pas comme prévu.

Mon programme ne comporte que deux lignes de code :

uint8_t aa=5;

cout<<"value is "<<aa<<endl;

Le résultat de ce programme est value is

c'est-à-dire qu'il imprime un blanc pour aa .

quand je change uint8_t en uint16_t le code ci-dessus fonctionne comme un charme.

J'utilise Ubuntu 12.04 (64 bit) et la version de mon compilateur est : gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

209voto

πάντα ῥεῖ Points 15683

Il n'imprime pas vraiment un blanc, mais très probablement le caractère ASCII de valeur 5, qui est invisible. Il y a un certain nombre de codes de caractères ASCII invisibles la plupart d'entre eux sont inférieurs à la valeur 32, qui est en fait le blanc.

Vous devez convertir aa à int pour sortir la valeur numérique, puisque ostream& operator<<(ostream&, unsigned char) essaie de sortir la valeur du caractère visible.

uint8_t aa=5;

cout << "value is " << int(aa) << endl;

56voto

arne Points 2300

uint8_t sera très probablement un typedef pour unsigned char . Le site ostream a une surcharge spéciale pour unsigned char c'est-à-dire qu'il imprime le caractère avec le chiffre 5, qui n'est pas imprimable, d'où l'espace vide.

22voto

pepper_chico Points 2428

Utilisation de ADL :

#include <iostream>
#include <typeinfo>
#include <cinttypes>

namespace numerical_chars {
std::ostream &operator<<(std::ostream &os, char c) {
    return os << (std::is_signed<char>::value ? static_cast<int>(c)
                                              : static_cast<unsigned int>(c));
}

std::ostream &operator<<(std::ostream &os, signed char c) {
    return os << static_cast<int>(c);
}

std::ostream &operator<<(std::ostream &os, unsigned char c) {
    return os << static_cast<unsigned int>(c);
}
}

int main() {
    using namespace std;

    uint8_t i = 42;

    {
        cout << i << endl;
    }

    {
        using namespace numerical_chars;
        cout << i << endl;
    }
}

sortie :

*
42

Un manipulateur de flux personnalisé serait également possible.

18voto

Joachim Pileborg Points 121221

C'est parce que l'opérateur de sortie traite l'élément uint8_t comme un char ( uint8_t n'est généralement qu'un alias pour unsigned char ), il imprime donc 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 .

8voto

cout traite aa comme char de la valeur ASCII 5 qui est un caractère non imprimable, essayez de le taper en tant que int avant l'impression.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X