1 байтовое целое без знака С++

Я запрограммировал класс под названием 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];

Это создает нежелательный вывод. Какой тип данных следует использовать для итерации через вектор?

Ответ 1

Да, используйте unsigned char.

Если доступно <stdint.h>, вы также можете использовать uint8_t.

Ответ 2

Не допускайте путаницы стандартного типа компилятора char; следующее совершенно законно:

char number[5] = { 1, 4, 3, 6, 2};   // Representation of decimal 14,362

Не то, чтобы в стиле char было что-то особенное, что заставляет вас думать о них как о символах; скорее, их удобный размер всего в 1 байт делает их подходящими для хранения значений, которые библиотечные процедуры, такие как printf, используют их для хранения 1-байтовых значений, которые он будет интерпретировать как символы под подходящей кодировкой.

Ответ 3

uint_least8_t - самый компактный тип данных для хранения одной десятичной цифры.

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

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

Ответ 4

Вывод, который вы видите, используя 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] );

Ответ 5

Использование char или unsigned char в качестве 1 байтового целочисленного типа не всегда так просто... Иногда вам нужен только тип типа номера, а не тип символа. Один из таких примеров: 1 байтовый целочисленный тип данных Другое - когда у вас есть функция, перегруженная для аргументов нескольких разных типов.