在C代码中通过数组添加两个大数

make two big number add by array in c code

我想在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。

EDIT1:最高进位被丢弃。结果保存在数组 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);

存在(至少)一个错误。看这段代码:

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 作为索引。

我假设你知道你正在为一个双序正整数实现 add 函数。

  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