#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.
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.
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;
}
Peut être ça:
char c = 0xab;
std::cout << (int)c;
J'espère que ça aide.
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.