Выход unsigned char
подобен выводу char
, который явно не соответствует ожидаемому OP.
Я проверил следующее на coliru:
#include <iomanip>
#include <iostream>
int main()
{
std::cout << "Output of (unsigned char)0xc0: "
<< std::hex << std::setw(2) << std::setfill('0') << (unsigned char)0xc0 << '\n';
return 0;
}
и получил:
Output of (unsigned char)0xc0: 0�
Это вызвано std::ostream::operator<<()
, который выбран из доступных операторов.Я посмотрел на cppreference
и найден
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
unsigned char ch );
в первом (с небольшой помощью из MM).
ОП предложил исправление: побитовое И с 0xff
, которое, казалось, работало.Проверка это в coliru.com:
#include <iomanip>
#include <iostream>
int main()
{
std::cout << "Output of (unsigned char)0xc0: "
<< std::hex << std::setw(2) << std::setfill('0') << (0xff & (unsigned char)0xc0) << '\n';
return 0;
}
Вывод:
Output of (unsigned char)0xc0: c0
Действительно, это похоже на работу.Почему?
0xff
является константой int
(строго говоря: целочисленный литерал ) и имеет тип int
.Следовательно, побитовое А также увеличивает (unsigned char)0xc0
до int
, дает результат типа int
, и, следовательно, применяется std::ostream::operator<<
для int
.
Этовариант решить это.Я могу предоставить другой - просто преобразование unsigned char
в unsigned
.
, где повышение от unsigned char
до int
вводит возможное расширение знакового бита (что нежелательно в этом случае),этого не происходит, когда unsigned char
конвертируется в unsigned
.Оператор потока вывода для unsigned
также обеспечивает предполагаемый вывод:
#include <iomanip>
#include <iostream>
int main()
{
std::cout << "Output of (unsigned char)0xc0: "
<< std::hex << std::setw(2) << std::setfill('0') << (unsigned)(unsigned char)0xc0 << '\n';
const unsigned char c = 0xc0;
std::cout << "Output of unsigned char c = 0xc0: "
<< std::hex << std::setw(2) << std::setfill('0') << (unsigned)c << '\n';
return 0;
}
Вывод:
Output of (unsigned char)0xc0: c0
Output of unsigned char c = 0xc0: c0
Live Demo на coliru