web-dev-qa-db-fra.com

Comment afficher un caractère sous forme d'entier via cout?

#include <iostream>

using namespace std;

int main()
{  
    char          c1 = 0xab;
    signed char   c2 = 0xcd;
    unsigned char c3 = 0xef;

    cout << hex;
    cout << c1 << endl;
    cout << c2 << endl;
    cout << c3 << endl;
}

Je m'attendais à ce que les résultats soient les suivants:

ab
cd
ef

Pourtant, je n'ai rien.

Je suppose que cela est dû au fait que cout traite toujours 'char', 'char signé' et 'char non signé' comme des caractères plutôt que comme des entiers sur 8 bits. Cependant, 'char', 'signé char' et 'unsigned char' sont tous des types intégraux.

Ma question est donc la suivante: comment afficher un caractère sous forme d’entier via cout?

PS: static_cast (...) est moche et a besoin de plus de travail pour supprimer les bits supplémentaires.

44
xmllmx
char a = 0xab;
cout << +a; // promotes a to a type printable as a number, regardless of type.

Cela fonctionne tant que le type fournit un opérateur unaire + avec une sémantique ordinaire. Si vous définissez une classe qui représente un nombre, pour fournir un opérateur unaire + avec une sémantique canonique, créez une operator+() qui renvoie simplement *this par valeur ou par référence à const. 

source: Parashift.com - Comment puis-je imprimer un caractère sous forme de nombre? Comment puis-je imprimer un caractère * pour que la sortie affiche la valeur numérique du pointeur?

87
ngwdaniel

Transformez-les en un type entier (et masque en conséquence!)

#include <iostream>

using namespace std;

int main()
{  
    char          c1 = 0xab;
    signed char   c2 = 0xcd;
    unsigned char c3 = 0xef;

    cout << hex;
    cout << (static_cast<int>(c1) & 0xFF) << endl;
    cout << (static_cast<int>(c2) & 0xFF) << endl;
    cout << (static_cast<unsigned int>(c3) & 0xFF) << endl;
}
9
sheu

Peut être ça:

char c = 0xab;
std::cout << (int)c;

J'espère que ça aide.

6
Luka Pivk

Une autre façon de le faire est avec std :: hex en dehors de casting (int) :

std::cout << std::hex << (int)myVar << std::endl;

J'espère que ça aide.

0
omotto