Как выводить символ как целое через 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;
Это сжато и безопасно, и производит тот же самый машинный код как другие методы.