Добрый день
Мне нужно реализовать работу с большими числами, размером около 4096 бит. На чистом си. (без использования библиотек)
Прошу Вас помочь мне разобраться в принципе таких действий
Полагаю что следует создать структуру, описывающую число.
#define BYTE_CHAR_SIZE (sizeof(unsigned char)) // размер char
#define BYTE_NUMBER_MAX_SIZE (4096/BYTE_CHAR_SIZE) // максимальное количество байт для представления числа
struct big_number
{
unsigned short byte_count; // количество занятых байт, для представления числа
unsigned char big_number[BYTE_NUMBER_MAX_SIZE]; // память для хранения числа
};
big_number - представляю в виде char а не int , т.к. вчера пытался разобраться в принципах работы с такими числами. И в одной библиотеке прочёл, что используется char для избежания проблем с умножением и делением больших чисел.(к сожалению, не могу найти ни ту библиотеку, ни описание..)
Давайте разберём инкримент числа.
Как полагаю, мне нужно будет в цикле пройти byte_count байт числа &big_number
При этом делать так
unsigned shor sign_flag = 0; // флаг, указывающий было ли переполнение
char *current_byte_ptr = &big_number; // текущий проверяемый байт
unsigned short tmp = 0; // хранение временного значения
/* Само действие инкримента */
tmp = *current_byte_ptr + 1; // сохранили в временную переменную, чтоб узнать было ли переполнение
/* Определяем, случилось ли переполнение */
if(tmp > BYTE_CHAR_SIZE) sign_flag = 1; // переполнение произошло
/* Если произошло переполнение */
if(sign_flag == 1)
{
/* Обработка по аналогии следующего байта и так, пока byte_count не станет равен 0 */
}
return; // Окончание действий инкремента
(возможно я просто логику действия не понимаю)
Далее интересует будет ли такой код (обработки *char) работать корректно на системах с разным порядком байт.
Как реализовывается сложение чисел? скажем мне нужно к какому-то числу, представленному struct big_number прибавить другое число struct big_number , к примеру 888888888889999999999999 , какой алгоритм действия должен быть?
Аналогичный вопрос относительно умножения и деления.
Заранее спасибо
(Библиотеки смотрел, не получилось разобраться, потому и задаю вопрос тут)