Можно ли сохранить двузначные числа в беззнаковом символе в С++

Для школьного задания мне нужно сохранить строковые значения от 0 до 255 в беззнаковом векторе символов. обычно я бы просто использовал для этого строки или целые числа, но нам специально сказали использовать unisgned char.

Изучив больше о беззнаковых символах, кажется, что он может сохранять код ASCII от 0 до 255 (правильно ли я понял?) Так возможно ли вообще сохранить двузначное (или тройное до 255) число цифр в беззнаковом символе?

Большое спасибо. Мне очень жаль, если это очень просто, но я все еще новичок в С++.


person m0xpl0x    schedule 19.01.2020    source источник
comment
unsigned char ch = 123; работает нормально. В чем опять проблема?   -  person Igor Tandetnik    schedule 19.01.2020
comment
unsigned char — целочисленный тип, точно так же, как int и long. Он должен быть достаточно большим, чтобы хранить значения в диапазоне от 0 до 255. Да, он также используется для хранения кодов символов, но не ограничивается ими.   -  person Pete Becker    schedule 19.01.2020
comment
Хорошо, я забыл упомянуть, что значения сохраняются в виде строк. Итак, скажем, у меня есть 'string str = 123', и через sstream я преобразовываю его в беззнаковый символ, например 'stringstream sso; ' --› ' sso ‹‹ ул; ' --› ' unsigned char ch; ' --› ' ссо ›› ч; ' а затем прочитать его с помощью ' std::cout ‹‹ ch ‹‹ endl; ' я просто получаю 1   -  person m0xpl0x    schedule 19.01.2020
comment
@ m0xpl0x Пожалуйста, не добавляйте подробности в комментарии (особенно такие важные детали), вместо этого отредактируйте свой вопрос, чтобы добавить их . Люди, скорее всего, не заметят эту часть в комментариях)   -  person Yksisarvinen    schedule 19.01.2020
comment
Не могли бы вы уточнить, является ли ваша задача преобразовать переменную типа int a = 123; в unsigned char b[] = {1, 2, 3}; или что-то другое?   -  person Bob__    schedule 19.01.2020
comment
У меня есть числовые значения, сохраненные в виде строк. например, «string str = 123» и хотите сохранить его как беззнаковый символ, чтобы добавить его в вектор беззнакового символа   -  person m0xpl0x    schedule 19.01.2020
comment
Похоже, вам нужен std::stoi или один из его многочисленных друзей.   -  person user4581301    schedule 19.01.2020


Ответы (3)


Несмотря на свое название, unsigned char не содержит символов ASCII (или не-ASCII). Он содержит целые значения, хранящиеся в виде последовательности битов. Каждый бит равен 0 или 1. Поскольку в символе 8 бит, у нас есть такие последовательности, как 10010111, 00010110, 00000010 и т. д. Это двоичные числа (или «основание 2»), поскольку мы используем только 2 цифры при их записи. («0» и «1»). Когда вы говорите «двузначное» или «трехзначное» число в своем вопросе, вы говорите о нашей повседневной системе счисления с основанием 10, в которой для записи чисел используются 10 цифр (от 0 до 9). Вам нужно немного прочитать о числах с основанием 2, чтобы понять это лучше. Но основная вещь заключается в том, что unsigned char содержит целое число от 0 до 255, и не имеет значения, как мы напишем его на нашем повседневном человеческом языке. Причина, по которой они называются символами, заключается в том, что исторически они часто использовались для представления символа текста. В основном целое число, хранящееся в char, использовалось для «поиска» символа в таблице ASCII.

person Robert Lewis    schedule 19.01.2020
comment
так что unsigned char - это не текст или число, а какие-то чистые данные? можно ли преобразовать строку str = 123; как беззнаковый символ? - person m0xpl0x; 19.01.2020
comment
Да, вы можете это сделать. Теперь вы говорите о разборе строки и преобразовании текста в целое число. Есть встроенные функции, помогающие в этом, но я не знаю подробностей. Хотя его должно быть легко найти. - person Robert Lewis; 19.01.2020

В беззнаковом символе вы можете хранить число от 0 до 255, поэтому ответ на ваш вопрос ДА, вы можете хранить 3-значное число, но обратите внимание, чтобы не переполнить емкость или вы храните только последний BITE (или 8 бит) информации.

Если вы храните в нем символы с их кодом, вам нужно использовать подписанный символ или, лучше, массив подписанных символов, который будет похож на строку.

person Zig Razor    schedule 19.01.2020
comment
Итак, если у меня есть строка str = 255, как я могу преобразовать ее в беззнаковый символ, а затем распечатать? - person m0xpl0x; 19.01.2020
comment
Да, ты можешь это сделать - person Zig Razor; 19.01.2020
comment
Как бы Вы это сделали ? Я пробовал это с stringstream, но он печатает только первое число - person m0xpl0x; 19.01.2020
comment
Попробуйте увидеть функцию c_str() строки - person Zig Razor; 19.01.2020
comment
Хорошо, я попытался либо преобразовать c_str() строки, либо ´unsigned char ch = stringname.c_str(); но все же он передает только первое число (так что 1 вместо 123 - person m0xpl0x; 19.01.2020
comment
Чтобы напечатать тип char как целое число, либо присвойте его целочисленной переменной, либо приведите его к целочисленной переменной. Система вывода перегружает типы char для вывода их значений в виде символов, даже если они не печатаются (например, управляющие символы). - person Thomas Matthews; 19.01.2020
comment
@moplox посмотрите на возвращаемый тип c_str, который является const char*... вы можете использовать его как массив - person Zig Razor; 19.01.2020

Да, вы можете хранить до 255.

Поскольку char состоит из 8 бит (1 байт), это означает, что он может хранить до 256 чисел (28 чисел).

  • Если это signed char, он может хранить от -128 до 127.
  • Если это unsigned char, он может хранить от 0 до 255 (только положительные числа).

Просто помните, если у вас n бит:

  1. Для signed: от -2n-1 до 2n-1-1.
  2. Для unsigned: от 0 до 2n-1.
person hrithik gautham    schedule 19.01.2020
comment
char не обязательно будет 8-битным, стандарты C++ ясно говорят об этом, см. здесь и здесь . Кроме того, byte не всегда имеет ширину 8 бит (см., например, Википедию). Самый первый вопрос: Байт — это единица цифровой информации, которая чаще всего состоит из восьми битов. - person Daniel Langr; 19.01.2020
comment
В старых компьютерах Cray все целочисленные типы были 32-битными. char, short, int и long были одного размера. Это делает байт 32-битным на этих компьютерах. Это на 100 % допустимо в C++. Стандарт определяет только минимальный размер и что тип не может быть больше, чем следующий больший тип. Почему бы точно не указать? Чтобы обеспечить поддержку аппаратного обеспечения, такого как старые Crays. - person user4581301; 19.01.2020