在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 函数。
- 避免使用
for (i = len-1; i >= 0; --i)
。当 i
无符号且 len
为 0 时,您可以捕获运行时错误。相反,请使用 for (i = len; i-- > 0;)
.
- 如果你需要一个小端整数而不是使用
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
我想在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 函数。
- 避免使用
for (i = len-1; i >= 0; --i)
。当i
无符号且len
为 0 时,您可以捕获运行时错误。相反,请使用for (i = len; i-- > 0;)
. - 如果你需要一个小端整数而不是使用
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