Имеют ли смысл целые числа, размер которых не является степенью двойки?

Это 8-битная архитектура с размером слова 16 бит. Теперь мне нужно использовать 48-разрядную целочисленную переменную. Насколько я понимаю, libm реализует 8, 16, 32, 64-битные операции (сложение, умножение, со знаком и без знака).

Поэтому для выполнения вычислений я должен хранить значение в 64-разрядном целом числе со знаком или без знака. Правильный?

Если это так, что нужно для предотвращения использования общих процедур? Например, для добавления:

  1. начать с LSB обеих переменных
  2. добавить их
  3. если доступно больше байтов, продолжить, в противном случае перейти к готовности
  4. сдвинуть обе переменные на 1 байт вправо
  5. перейти к 1)

2 ответа

Решение

libm реализует подпрограммы для стандартных размеров типов, и компилятор выбирает подходящую для выражения.

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

Вы можете реализовать операции как функции, скажем, add(int48_t, int48_t), но тогда компилятор не сможет выполнять оптимизации, такие как постоянное сворачивание и т. д.

Итак, ничто не мешает вам реализовать свой собственный компилятор, но действительно ли это необходимо? Вам действительно нужно сохранить это место? Если так, то дерзайте!

Это правильно, сохранение пары битов (почти во всех случаях) не стоит усилий по реализации собственной логики.

Другие вопросы по тегам