сделать два больших числа, добавленных массивом в коде c - PullRequest
0 голосов
/ 17 октября 2019

Я хочу построить два больших числа по массиву в программировании на c и добавить их.

Ниже приведен мой код:

void add(unsigned char* a, unsigned char* b, unsigned int len)
{
    int i;
    unsigned short T;
    unsigned char carry = 0;
    for (i = len - 1; i >= 0; --i)
    {
        T = (unsigned short)(a[i]) + (unsigned short)(b[i]) + (unsigned short)carry;
        //T = a[i] + b[i] + carry;
        if (T > 0xFF)
            carry = 1;
        else
            carry = 0;

        a[i] = (unsigned char)T;
    }
}

Максимальное значение в массиве a и b длякаждый элемент 255.

РЕДАКТИРОВАТЬ1: самый высокий перенос сбрасывается. Результат - сохранение в массиве a.

EDIT2: заменить «Byte» на «carry».

Исходный код:

Integer B1(B, SM3_BLOCK_SIZE);
++B1;

for (i = 0; i < ILen; i += v)
  (Integer(I + i, v) + B1).Encode(I + i, v);

Я пишу две новые функции,Один как выше add(), другой выглядит следующим образом:

void add_one(unsigned char *arr, unsigned int len)
{
    int i;
    for (i = len-1; i >= 0; --i)
    {
        arr[len] += 1;
        if (arr[len] != 0) 
            return; 
    }
}

Если мой код является правым, исходный код будет следующим:

add_one(B, SM3_BLOCK_SIZE);
for (i = 0; i < ILen; i += v)
  add(I + i, B, SM3_BLOCK_SIZE);

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Есть (по крайней мере) одна ошибка. Посмотрите на этот код:

void add_one(unsigned char *arr, unsigned int len)
{
    int i;
    for (i = len-1; i >= 0; --i)
    {
        arr[len] += 1;        // Indexing using len is wrong
        if (arr[len] != 0)    // Indexing using len is wrong 
            return; 
    }
}

Вы, вероятно, хотите использовать i в качестве индекса.

1 голос
/ 17 октября 2019

Я предполагаю, что вы знаете, что реализуете функцию добавления для бигендовского положительного целого числа.

  1. Избегайте использования for (i = len-1; i >= 0; --i). Вы можете поймать ошибку времени выполнения, когда i без знака и len равно 0. Вместо этого используйте for (i = len; i-- > 0;).
  2. Если вам нужно целое число с прямым порядком байтов, чем используйте for (int i = 0; i < len; ++i)
char add(unsigned char* a, unsigned char* b, unsigned int len)
{
    unsigned short carry = 0;
    //for (int i = 0; i < len; ++i) // for little-endian
    for (int i = len; i-- > 0;) // for big-endian
    {
        carry += a[i] + b[i];
        a[i] = carry & 0xFF;
        carry >>= 8;
    }
    return carry;
}

Тесты

    unsigned char a[5] = {255,2,3,4,5};
    unsigned char b[5] = {255,256-2,256-3,4,5};
    char overflow = add(a,b,5);
    printf("%d %d %d %d %d / %d",a[0],a[1],a[2],a[3],a[4] , overflow);

Вывод

255 1 0 8 10 / 1
...