Является ли это поведение стандартом
Поведение стандартное в том смысле, что если uint8_t
является typedef для unsigned char
, то он всегда будет печатать символ, поскольку std::ostream
имеет перегрузку для unsigned char
и выводит содержимое переменной в виде символа.
Не должен ли быть лучший способ определить uint8_t
, который гарантированно будет обрабатываться как число, а не символ?
Для этого комитет C++ должен был ввести новый фундаментальный тип. В настоящее время единственными типами, у которых sizeof()
равен 1, являются char
, signed char
и unsigned char
. Возможно, они могли бы использовать bool
, но bool
не обязательно должен иметь размер 1, и тогда вы все еще в той же лодке, поскольку
int main()
{
bool foo = 42;
std::cout << foo << '\n';
}
будет печатать 1
, а не 42
, так как любое значение, отличное от нуля, равно true, а true печатается как 1
, но по умолчанию.
Я не говорю, что это невозможно сделать, но это большая работа для чего-то, что можно обработать с помощью приведение или функция
C++17 представляет std::byte
, который определяется как enum class byte : unsigned char {};
. Таким образом, это будет один байт шириной, но это не символьный тип. К сожалению, поскольку это enum class
, у него есть свои ограничения. Для него были определены побитовые операторы, но для него нет встроенных потоковых операторов, поэтому вам нужно будет определить свои собственные для ввода и вывода. Это означает, что вы все еще конвертируете его, но, по крайней мере, вы не будете конфликтовать со встроенными операторами для unsigned char
. Это дает вам что-то вроде
std::ostream& operator <<(std::ostream& os, std::byte b)
{
return os << std::to_integer<unsigned int>(b);
}
std::istream& operator <<(std::istream& is, std::byte& b)
{
unsigned int temp;
is >> temp;
b = std::byte{b};
return is;
}
int main()
{
std::byte foo{10};
std::cout << foo;
}
person
NathanOliver
schedule
25.08.2016
uint8_t
как небольшое целое число без знака, вам нужно привести его перед выводом. Например,static_cast<uint32_t>(some_uint8_t_variable)
- person Some programmer dude   schedule 25.08.2016char
гарантированно имеетsizeof()
1. - person NathanOliver   schedule 25.08.2016char
. Да, C++ мог бы добавить новый тип, но это противоречило бы C, где возникли эти определения типов. - person Pete Becker   schedule 25.08.2016std::cout << +static_cast<uint8_t>(65);
сделает то, что вы хотите. - person Pete Becker   schedule 25.08.2016bool
и все остальное имеет размер, определенный реализацией. Единственный существующий тип с известным размером 1 — это варианты char. - person NathanOliver   schedule 25.08.2016+
— это унарный оператор, который во многом похож на унарный-
, за исключением того, что он не инвертирует значение. Обычно его считают бессмысленным, но здесь он полезен, поскольку в качестве арифметического оператора компилятор продвигает свой аргумент кint
. Итак,+x
эквивалентно(int)x
. - person Pete Becker   schedule 25.08.2016+static_cast<uint8_t>(65)
не удастся выполнить ваш компилятор - person M.M   schedule 25.08.2016uint[_fast|_least]N_t
таким образом. Например, вы должны сначала выполнить приведение кunsigned long long
. - person L. F.   schedule 22.07.2019