Я читал, что для малых целых чисел можно использовать "char". Однако, когда я пытаюсь,
unsigned char A = 4;
std::cout << A << std::endl;
он дает символ, а не 4.
Я читал, что для малых целых чисел можно использовать "char". Однако, когда я пытаюсь,
unsigned char A = 4;
std::cout << A << std::endl;
он дает символ, а не 4.
То, что вы испытываете, - это последствия перегрузки оператора. Оператор <<
предполагает, что вы, скорее всего, захотите напечатать символ, когда передаете ему переменную типа char
, поэтому она ведет себя иначе, чем вы ожидали бы от нее для интегральных переменных.
Как предложено Vivek Goel, вы можете заставить компилятор выбрать перегрузку, которую вы действительно хотите:
unsigned char A = 4;
std::cout << static_cast<unsigned int>(A) << std::endl;
Приложение: если вы не работаете с средой с сильно ограниченными ресурсами (особенно маленькая память), вы оптимизируете ее с неправильным концом. Операции на unsigned int
обычно быстрее, чем на unsigned char
, потому что ваш процессор не может извлекать одиночные байты, но должен получить как минимум кратное 4 и маскировать остальные 3 байта.
Существует перегрузка operator<<
для std::ostream
и (signed
/unsigned
) char
, которая выполняет вывод символов; чтобы вывести целочисленное значение символа, вам необходимо выполнить бросок:
std::cout << (int)A << std::endl;
Однако это то, что называется "старомодным" (более конкретно, C-стиль). У С++ есть более операционные операторы, которые проще искать и обычно предпочитают:
std::cout << static_cast<int>(A) << std::endl;
Но это громоздко печатать; идиоматической альтернативой является использование оператора +
, который продвигает свой аргумент в (unsigned
) int
:
std::cout << +A << std::endl;
Это то, что вы должны использовать.
Это должно быть
unsigned char A = 4;
std::cout << (int)A << std::endl;
A char IS небольшое целое число (с диапазоном от -127 до +127) и оно подвергается той же целочисленной арифметике, что и целые числа.
Проблема здесь заключается в смешивании концепций между внутренним представлением (двоичным числом, представляющим диапазон от -127 до +127) с внешним, что обычно делает входные и выходные функции отображаемыми как "глиф чей ASCII-код - это число, на которое оно выполнено", тогда как для integer внешнее представление представляет собой "последовательность символов, которая читается как целое число, представленное в десятичной форме"
Самый простой способ распечатать его как число, преобразовать его в int
непосредственно перед передачей его функции вывода (например, cout << int(ch)
или любой эквивалентной формы преобразования)
Для отдельных объектов увеличение размера кода, вероятно, приведет к уменьшению размера хранилища, любого из них (для выравнивания может потребоваться память, следующая за объектом). Используйте int
, если вам не нужен большой массив небольших целых чисел.