Выполнение операций типа add, sub, mul, div, mod для 2 целых чисел с их байтами

#c #math #binary #bit

#c #математика #двоичный #бит

Вопрос:

У меня есть байты из 2 целых чисел (скажем, 32-битный int), теперь можно ли добавить их, используя байты?

У меня есть

 char b1[4], b2[4];
int a= 2311;
int b= 233134;
memcpy(b1, amp;a, 4);
memcpy(b2, amp;b, 4);
 

Мой вопрос в том, существует ли какой-либо алгоритм для добавления, mul, sub чисел из байтов, а количество байтов числа не является фиксированным, оно может быть 32-битным, 64-битным, 128-битным.

Обратите внимание, что мне не нужна какая-либо библиотека или framewprk только для c

Комментарии:

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

2. @Someprogrammerdude не представляет большой проблемы с укладкой. Просто изучаю низкоуровневое программирование, и мне любопытно, как это делается.

3. В общем, ответ «Нет». Проблема в порядковом порядке. Перенос обязательно распространяется от наименее значимого к наиболее значимому. Поэтому, если вы не знаете порядковый номер, перенос не может быть обработан правильно.

4. Тогда все, что вам нужно сделать, это сложение в начальной школе. Аналогично для трех других операций.

5. «Простое» решение: преобразовать обратно в простые int значения … 😉

Ответ №1:

Ваш вопрос в его основе не о реализации на C , а об алгоритмах для выполнения простой арифметики.

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

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

Поскольку вы упомянули int в качестве типа данных, вам необходимо принять во внимание знак. Это проще, если значения не имеют знака.

Комментарии:

1. Не могли бы вы привести пример того, как это сделать? Специально для mul и div с байтами

2. А также какой-то способ управления переполнением

3. Нет, у меня не осталось времени для этого. Особенно для умножения и деления требуется рабочее сложение и вычитание. SO не является службой написания кода. Вы можете начать с реализации добавления значений без знака. Помните начальную школу: вы не научились делить, пока не научились складывать и вычитать. 😉 — Честно говоря, зачем кому-то использовать байты? Если вам нужна целочисленная арифметика больших чисел, разбейте ее на самый широкий тип, который может обрабатывать процессор, и используйте ассемблер для выполнения работы. Гораздо проще реализовать это на ассемблере.

4. Я работаю с виртуальной машиной, которая работает с байтами

5. Ну, тогда… Используйте байты. В последний раз мне приходилось реализовывать такие функции 40 лет назад на 8-битном процессоре. Целевой тип данных был 16-битным целым числом со знаком. Сложение и вычитание были простыми, а для умножения и деления я использовал двоичный алгоритм. Все было реализовано на ассемблере, потому что язык более высокого уровня скрывает определенные возможности, такие как флаг переноса, которые значительно упрощают жизнь.