Как выводить unsigned / подписанный символ или типы как целые числа с << в C ++

StackOverflow https://stackoverflow.com/questions/4049986

Вопрос

Задний план:

У меня есть шаблонные операторы потока (например, 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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top