Как вывести символ в виде целого числа через 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;
}
Я ожидал, что результат будет следующим:
ab
cd
ef
Тем не менее, я ничего не получил.
Я предполагаю, что это потому, что cout всегда рассматривает 'char', 'signature char' и 'unsigned char' как символы, а не 8-битные целые числа. Тем не менее, 'char', 'signature char' и 'unsigned char' являются целыми типами.
Поэтому мой вопрос: как вывести символ в виде целого числа через cout?
PS: static_cast (...) уродлив и требует дополнительной работы для обрезки лишних битов.
6 ответов
char a = 0xab;
cout << +a; // promotes a to a type printable as a number, regardless of type.
Это работает, пока тип предоставляет одинарный +
оператор с обычной семантикой. Если вы определяете класс, представляющий число, чтобы предоставить унарный оператор + с канонической семантикой, создайте operator+()
это просто возвращает *this
либо по значению, либо по ссылке на const.
Источник: Parashift.com - Как я могу напечатать символ в виде числа? Как я могу напечатать символ *, чтобы на выходе отображалось числовое значение указателя?
Приведите их к целочисленному типу (и, соответственно, к битовой маске!), То есть:
#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;
Надеюсь, поможет.
Другой способ - перегрузить
<<
оператор:
#include <iostream>
using namespace std;
typedef basic_ostream<char, char_traits<char>> basicOstream;
/*inline*/ basicOstream &operator<<(basicOstream &stream, char c) {
return stream.operator<<(+c);
}
/*inline*/ basicOstream &operator<<(basicOstream &stream, signed char c) {
return stream.operator<<(+c);
}
/*inline*/ basicOstream &operator<<(basicOstream &stream, unsigned char c) {
return stream.operator<<(+c);
}
int main() {
char var1 = 10;
signed char var2 = 11;
unsigned char var3 = 12;
cout << var1 << endl;
cout << var2 << endl;
cout << var3 << endl;
return 0;
}
который печатает следующий вывод:
10
11
12
Process finished with exit code 0
Я считаю, что это очень аккуратно и полезно. надеюсь, что это поможет!
А также, если вы хотите напечатать
hex
значение вы можете сделать так:
basicOstream &operator<<(basicOstream &stream, char c) {
return stream.operator<<(hex).operator<<(c);
} // and so on...
Как насчет:
char c1 = 0xab;
std::cout << int{ c1 } << std::endl;
Это сжато и безопасно.
Другой способ сделать это с помощью std::hex, кроме casting (int):
std::cout << std::hex << (int)myVar << std::endl;
Я надеюсь, что это помогает.