Как вывести символ в виде целого числа через 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;

Я надеюсь, что это помогает.

Другие вопросы по тегам