Динамический целочисленный размер: int64_t, int32_t, uint32_t и т. Д.

Я программирую приложение, которое позволяет пользователю выбирать размер в битах целочисленного хранилища и делать с ним математику. Они могут выбрать 8, 16, 32 или 64-битное хранилище как со знаком или без знака. Это устанавливается и изменяется во время выполнения, и приложение будет выполнять математические операции с данным типом.

Пример взаимодействия с пользователем:

  • Войдите в 16-битный режим
  • Тип 5С
  • Пресс Плюс
  • Тип 2А
  • Нажмите Оценить
    • return {value1.getSigned16 () + value2.getSigned16 (); }

Я хотел бы избежать программирования 8 случаев для каждого оператора. Я полагаю, что указатель или указатель на функцию могут хорошо работать для этого. Методу оценки не важно, какой размер целого числа я использую, если они оба одинаковы. Проблема в том, что я не могу понять, как это реализовать, так как указатели заботятся о том, какая переменная возвращается. Я подумал об использовании универсального указателя, но это не помогает мне, когда мне нужно разыменовать, мне все равно понадобится 8 случаев.

value1.getProperSize() + value2.getProperSize();

// * This obviously won't work
int* getProperSize() {
if (size == 16) return (int16_t)storageValue;
if (size == 32) return (int32_t)storageValue;
// Etc...
}

Любые мысли или предложения по поводу решения этой проблемы с благодарностью.

1

Решение

Вы не можете иметь «произвольный» тип возвращаемого значения для функции. Если вы хотите вернуть целое число другого размера, есть несколько способов сделать это: объединение, перегрузки функций, шаблоны (которые бы покрывали перегрузки функций) или a (и я сжимаюсь, когда я набираю это) void* возвращаемое значение

Исходя из того, что вы спросили, профсоюз, вероятно, подойдет лучше всего:

struct MyInteger
{
uint8_t intSize;
union
{
int8_t  Int8;
int16_t Int16;
int32_t Int32;
int64_t Int64;
} intValue;
};

MyInteger getProperSize()
{
MyInteger result;
if (size == 8)
{
result.intSize = 8;
result.intvalue.Int8 = someValue;
}
// ...
return result;
}

Размер этой структуры будет минимум 72 бита (исключая вопросы заполнения и выравнивания), так что вы можете просто вернуть int64_t и это будет охватывать каждый меньший целочисленный размер.

2

Другие решения

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

2

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

1
По вопросам рекламы [email protected]