#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;
}
Я ожидал, что результат будет следующим:
ab
cd
ef
Тем не менее, я ничего не получил.
Я предполагаю, что это потому, что cout всегда рассматривает ‘char’, ‘signature char’ и ‘unsigned char’ как символы, а не 8-битные целые числа. Тем не менее, ‘char’, ‘signature char’ и ‘unsigned char’ являются целыми типами.
Поэтому мой вопрос: как вывести символ в виде целого числа через cout?
PS: static_cast (…) уродлив и требует дополнительной работы для обрезки лишних битов.
char a = 0xab;
cout << +a; // promotes a to a type printable as a number, regardless of type.
Это работает до тех пор, пока тип предоставляет одинарный +
оператор с обычной семантикой. Если вы определяете класс, который представляет число, чтобы предоставить унарный оператор + с канонической семантикой, создайте operator+()
это просто возвращает *this
либо по значению, либо по ссылке на const.
Приведите их к целочисленному типу (и, соответственно, к битовой маске!), Т.е.
#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;
}
Может быть, это:
char c = 0xab;
std::cout << (int)c;
Надеюсь, поможет.
Еще один способ сделать это с станд :: шестигранной Помимо кастинг (int):
std::cout << std::hex << (int)myVar << std::endl;
Я надеюсь, что это помогает.