Ответ 1
Да, используйте unsigned char
.
Если доступно <stdint.h>
, вы также можете использовать uint8_t
.
Я запрограммировал класс под названием HugeInteger, который может выполнять арифметику (add, sub, multiply) с числами "бесконечно". Он обрабатывает каждый бит цифры в номере как отдельную цифру (например, 1234 = 1, 2, 3 и 4). Я сохраняю эти числа в векторе (vector<short>)
. Теперь, поскольку каждая цифра может принимать значения от 0 до 9, мне не нужно хранить их как цифру 2 байта. Есть ли способ (без использования char) для хранения цифр в виде 1 байтового целых чисел без знака? Спасибо!
Update:
vector<unsigned char> v;
v.push_back(1);
v.push_back(2);
for (size_t i = 0; i < v.size(); i++)
cout << v[i];
Это создает нежелательный вывод. Какой тип данных следует использовать для итерации через вектор?
Да, используйте unsigned char
.
Если доступно <stdint.h>
, вы также можете использовать uint8_t
.
Не допускайте путаницы стандартного типа компилятора char
; следующее совершенно законно:
char number[5] = { 1, 4, 3, 6, 2}; // Representation of decimal 14,362
Не то, чтобы в стиле char
было что-то особенное, что заставляет вас думать о них как о символах; скорее, их удобный размер всего в 1 байт делает их подходящими для хранения значений, которые библиотечные процедуры, такие как printf
, используют их для хранения 1-байтовых значений, которые он будет интерпретировать как символы под подходящей кодировкой.
uint_least8_t
- самый компактный тип данных для хранения одной десятичной цифры.
Если ваша система поддерживает тип данных размером 1 байт, это будет им. В противном случае это будет следующий наименьший тип данных.
Вам может потребоваться указать значение при использовании оператора вставки потока, чтобы убедиться, что вы получаете числовой вывод вместо обработки символов.
Вывод, который вы видите, используя cout < на неподписанном char сводится к механике < < оператор, когда используется с std:: ostream (в частности, различные перегрузки оператора < < будут отображать значение по-разному - перегрузки char/unsigned char обычно предполагают, что вам требуется представление символа вместо числовое)
Основное представление вашего беззнакового char по-прежнему совпадает с номером, который вы ввели в вектор - unsigned char по-прежнему является беззнаковым 1-байтовым целым)
Если вы хотите изменить выход, тогда вам нужно избегать использования перегрузки < < оператор, предназначенный для char или unsigned char - самый простой способ сделать это - выполнить бросок
vector<unsigned char> v;
v.push_back(1);
v.push_back(2);
for (size_t i = 0; i < v.size(); i++)
cout << static_cast<int>( v[i] );
Использование char или unsigned char в качестве 1 байтового целочисленного типа не всегда так просто... Иногда вам нужен только тип типа номера, а не тип символа. Один из таких примеров: 1 байтовый целочисленный тип данных Другое - когда у вас есть функция, перегруженная для аргументов нескольких разных типов.