Как выводить символ как целое через 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", "подписанный char" и "unsigned char" как символы, а не 8-битные целые числа. Однако "char", "подписанный char" и "unsigned char" - все целые типы.

Итак, мой вопрос: как вывести символ как целое через cout?

PS: static_cast (...) является уродливым и требует больше работы для обрезки дополнительных бит.

Ответ 1

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

Это работает до тех пор, пока тип предоставляет унарный оператор + с обычной семантикой. Если вы определяете класс, который представляет число, чтобы предоставить унарный оператор + с канонической семантикой, создайте operator+() который просто возвращает *this либо по значению, либо по ссылке на const.

Источник: Parashift.com - Как я могу напечатать символ в виде числа? Как я могу напечатать символ *, чтобы в выводе было указано числовое значение указателя?

Ответ 2

Переведите их в целочисленный тип (и битмасс соответственно!) i.e.:

#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;
}

Ответ 3

Возможно, это:

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

Надеюсь, что это поможет.

Ответ 4

Другой способ сделать это с помощью std :: hex, кроме cast (int):

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

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

Ответ 5

Как насчет:

char c1 = 0xab;
std::cout << int{ c1 } << std::endl;

Это сжато и безопасно, и производит тот же самый машинный код как другие методы.