Использование char для малого целого числа (C ++) - PullRequest
13 голосов
/ 29 января 2012

Я читал, что можно использовать "char" для маленьких целых чисел.Однако, когда я пытаюсь,

unsigned char A = 4;
std::cout << A << std::endl;

, он дает символ, а не 4.

Ответы [ 5 ]

18 голосов
/ 29 января 2012

Вы испытываете последствия перегрузки оператора.Оператор << предполагает , что вы, скорее всего, захотите напечатать символ при передаче ему переменной типа char, поэтому он ведет себя иначе, чем вы ожидаете для целочисленных переменных.

В соответствии с предложением Vivek Goel вы можете заставить компилятор выбрать нужную перегрузку:

unsigned char A = 4;
std::cout << static_cast<unsigned int>(A) << std::endl;

Добавление: если вы не работаете в среде с жесткими ограничениямиресурсы (особенно крошечная память), вы оптимизируете не с той стороны.Операции на unsigned int обычно выполняются быстрее, чем на unsigned char, поскольку ваш процессор не может извлечь отдельные байты, но должен получить как минимум кратное 4 и замаскировать остальные 3 байта.

6 голосов
/ 29 января 2012

Существует перегрузка operator<< для std::ostream и (signed / unsigned) char, которая выполняет вывод символов;чтобы вывести целочисленное значение символа, вам необходимо выполнить приведение:

std::cout << (int)A << std::endl;

Однако это то, что называется приведением в «старом стиле» (точнее, в стиле C).В C ++ есть операторы приведения, которые являются более явными, более простыми для поиска и обычно предпочтительными:

std::cout << static_cast<int>(A) << std::endl;

Но это неудобно для типа;идиоматическая альтернатива заключается в использовании оператора +, который переводит свой аргумент в (unsigned) int:

std::cout << +A << std::endl;

Это то, что вы должны использовать.

4 голосов
/ 29 января 2012

Char IS небольшое целое число (с диапазоном от -127 до +127), и оно подвергается той же целочисленной арифметике, что и целые числа.

Проблема здесь заключается вСмешение понятий между внутренним представлением (двоичное число, представляющее диапазон от -127 до +127) с внешним, что обычно заставляет функции ввода и вывода представлять его как «глиф, код ASCII которого является числом, передаваемымit ", в то время как для целого числа внешнее представление - это" последовательность символов, которая читается как целое число, представленное в десятичной форме "

Самый простой способ напечатать его как число - это преобразовать его в int непосредственно передпередать его функции вывода (например, cout << int(ch) или любой другой эквивалентной форме преобразования)

4 голосов
/ 29 января 2012

должно быть

 unsigned char A = 4;
    std::cout << (int)A << std::endl;
1 голос
/ 29 января 2012

Для отдельных объектов увеличение размера кода, вероятно, затмевает уменьшение размера хранилища любого (память, следующая за объектом, может понадобиться для заполнения выравнивания).Используйте int, если вам не нужен большой массив маленьких целых чисел.

...