Как выводить unsigned / подписанный символ или типы как целые числа с << в C ++
-
27-09-2019 - |
Вопрос
Задний план:
У меня есть шаблонные операторы потока (например, operator << (ostream &, std::vector <T>)
) (этот выходные элементы контейнера, которые могут иметь некоторый 8-битный целочисленный тип (например, unsigned char
, int_least8_t
, et cetea).
Проблема:
По умолчанию эти типы выводятся как char
(ASCII). Я только использовал char
(или wchar_t
или что-то еще) для переменных ASCII, никогда не безгнитных / подписанных типов. Как я могу получить эти другие 8-битные типы, чтобы всегда выводиться как signed int
/ unsigned int
(Числа) вместо этого, даже когда вызывающий абонент не знает типа?
Сначала пытается:
Я пробовал (с GCC), например определяющим operator << (ostream &, unsigned char)
с литым в нем (т.е. stream << static_cast <int> (value)
. Отказ Это работает для unsigned char
ценности, но потом uint8_t
все еще получает вывод как char
.
Такой же базовый тип (т.е. unsigned/signed char
нельзя использовать в перегрузках, поэтому я не могу определить перегрузку, например, operator << (ostream &, int_fast8_t)
.
Решение
Один из способов, который приходит на ум, использует черты типа для определения типа вывода для каждого типа. Вы должны были бы объявить, что для каждого типа вручную. Черты могут быть определены как структура шаблона, который специализируется на каждый тип данных, который имеет другой тип вывода, чем сам тип данных:
template< T >
struct output_trait {
typedef const T & output_type;
}
В вашем операторе вы пишете:
std::cout << static_cast< output_trait< T >::output_type >( variable ) << std::endl;
Это не будет представляться по умолчанию, а для типов, для которых output_trait
Специализирован, что это сделает актеры:
template<>
struct output_trait< unsigned char > {
typedef unsigned int output_type;
}
Другие советы
Вы запутаете фактические данные, хранящиеся в переменной, с каким-либо представлением вы выбираете для печати.
Подумайте об этом таким образом: chars
, ints
, doubles
, longs
, все, что все они просто кусочки памяти для вас, чтобы хранить числа в. Char - это число от 0 до 255 (или -128 и 127) - вы можете выбрать его как символ ASCII, или как номер, или как звезды в небе с помощью OpenGL.
Если вы хотите увидеть номер за символом «A», просто поручите свою программу лечить этот кусок памяти (что для вас содержит номер «A») в виде номера. Используйте отливки. Здесь:
http://www.cplusplus.com/doc/tutorial/typecast/
Посмотрите, что это поможет!
Вы можете просто бросить это:
#include<iostream>
int main()
{
uint8_t blah = 65;
std::cout << static_cast<int>(blah) << "\n";
return 0;
}
65
Если я понял вас правильно .. Вывод так:
std::cout << ( unsigned int )char << '\n';
Или более стиль C ++ - используйте Static_cast, например:
int main()
{
char a = 'a';
char b = 97;
std::cout << static_cast< unsigned int >( a ) << '\n';
std::cout << static_cast< unsigned int >( b ) << '\n';
return 0;
}
обе std::cout
Будет печатать то же самое: первый - код ASCII 'a'
: 97
, второй - только ценность 97
, хранится в б. Обе, a
а также b
, абсолютно одинаковы.
Вы можете бросить их, прежде чем выводить их:
std::cout << (unsigned int) container[index];